Previous version which works for my stm32f401 Nucleo board

Fork of X_NUCLEO_IDB0XA1 by ST

Committer:
apalmieri
Date:
Thu Jul 09 08:38:06 2015 +0000
Revision:
84:2beeb1cc9d57
Parent:
77:332b416123b4
Child:
85:9970c3304c82
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 // ANDREA -- FIXME: HR control point char is not correctly handled
Andrea Palmieri 73:142f3ded2091 154 //continue;
Silvio Lucio Oliva 70:d20d30f59b1c 155 }
Silvio Lucio Oliva 70:d20d30f59b1c 156 if((p_char->getProperties() &
Silvio Lucio Oliva 70:d20d30f59b1c 157 (GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_READ|
Silvio Lucio Oliva 70:d20d30f59b1c 158 GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_NOTIFY| GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_INDICATE))) {
Silvio Lucio Oliva 70:d20d30f59b1c 159 DEBUG("Setting up Gatt GATT_NOTIFY_READ_REQ_AND_WAIT_FOR_APPL_RESP Mask\n\r");
Silvio Lucio Oliva 70:d20d30f59b1c 160 Gatt_Evt_Mask = Gatt_Evt_Mask | GATT_NOTIFY_READ_REQ_AND_WAIT_FOR_APPL_RESP;
Silvio Lucio Oliva 70:d20d30f59b1c 161 } //This will support also GATT_SERVER_ATTR_READ_WRITE since it will be covered by previous if() check.
Andrea Palmieri 73:142f3ded2091 162
Silvio Lucio Oliva 70:d20d30f59b1c 163 if(type==UUID::UUID_TYPE_SHORT) {
Andrea Palmieri 73:142f3ded2091 164 ret = aci_gatt_add_char(service.getHandle(),
Andrea Palmieri 73:142f3ded2091 165 UUID_TYPE_16,
Andrea Palmieri 73:142f3ded2091 166 int_8_uuid,
Andrea Palmieri 73:142f3ded2091 167 p_char->getValueAttribute().getMaxLength() /*2*/ /*Value Length*/,
Andrea Palmieri 73:142f3ded2091 168 p_char->getProperties(),
Andrea Palmieri 73:142f3ded2091 169 ATTR_PERMISSION_NONE,
Andrea Palmieri 73:142f3ded2091 170 Gatt_Evt_Mask /*Gatt_Evt_Mask*/,
Andrea Palmieri 73:142f3ded2091 171 16 /*Encryption_Key_Size*/,
Andrea Palmieri 73:142f3ded2091 172 1 /*isVariable*/,
Andrea Palmieri 73:142f3ded2091 173 &bleCharacteristic);
Andrea Palmieri 73:142f3ded2091 174
Andrea Palmieri 73:142f3ded2091 175 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 176
Andrea Palmieri 73:142f3ded2091 177 } else if(type==UUID::UUID_TYPE_LONG) {
Andrea Palmieri 73:142f3ded2091 178 ret = aci_gatt_add_char(service.getHandle(),
Andrea Palmieri 73:142f3ded2091 179 UUID_TYPE_128,
Andrea Palmieri 73:142f3ded2091 180 char_base_uuid,
Andrea Palmieri 73:142f3ded2091 181 p_char->getValueAttribute().getMaxLength() /*2*/ /*Value Length*/,
Andrea Palmieri 73:142f3ded2091 182 p_char->getProperties(),
Andrea Palmieri 73:142f3ded2091 183 ATTR_PERMISSION_NONE,
Andrea Palmieri 73:142f3ded2091 184 Gatt_Evt_Mask /*Gatt_Evt_Mask*/,
Andrea Palmieri 73:142f3ded2091 185 16 /*Encryption_Key_Size*/,
Andrea Palmieri 73:142f3ded2091 186 1 /*isVariable*/,
Andrea Palmieri 73:142f3ded2091 187 &bleCharacteristic);
Andrea Palmieri 73:142f3ded2091 188
Andrea Palmieri 73:142f3ded2091 189 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 190 }
Andrea Palmieri 73:142f3ded2091 191
Silvio Lucio Oliva 70:d20d30f59b1c 192 /* Update the characteristic handle */
Andrea Palmieri 77:332b416123b4 193 //uint16_t charHandle = characteristicCount;
Silvio Lucio Oliva 70:d20d30f59b1c 194
Silvio Lucio Oliva 70:d20d30f59b1c 195 bleCharHanldeMap.insert(std::pair<uint16_t, uint16_t>(bleCharacteristic, servHandle));
Silvio Lucio Oliva 70:d20d30f59b1c 196
Silvio Lucio Oliva 70:d20d30f59b1c 197 p_characteristics[characteristicCount++] = p_char;
Silvio Lucio Oliva 70:d20d30f59b1c 198 p_char->getValueAttribute().setHandle(bleCharacteristic); //Set the characteristic count as the corresponding char handle
Silvio Lucio Oliva 70:d20d30f59b1c 199 DEBUG("added bleCharacteristic handle =%u\n\r", bleCharacteristic);
Andrea Palmieri 73:142f3ded2091 200
Silvio Lucio Oliva 70:d20d30f59b1c 201 if ((p_char->getValueAttribute().getValuePtr() != NULL) && (p_char->getValueAttribute().getInitialLength() > 0)) {
Andrea Palmieri 77:332b416123b4 202 write(p_char->getValueAttribute().getHandle(), p_char->getValueAttribute().getValuePtr(), p_char->getValueAttribute().getInitialLength(), false /* localOnly */);
Silvio Lucio Oliva 70:d20d30f59b1c 203 }
Andrea Palmieri 73:142f3ded2091 204
Silvio Lucio Oliva 70:d20d30f59b1c 205 // add descriptors now
Silvio Lucio Oliva 70:d20d30f59b1c 206 uint16_t descHandle = 0;
apalmieri 84:2beeb1cc9d57 207 DEBUG("p_char->getDescriptorCount()=%d\n\r", p_char->getDescriptorCount());
apalmieri 84:2beeb1cc9d57 208
Silvio Lucio Oliva 70:d20d30f59b1c 209 for(uint8_t descIndex=0; descIndex<p_char->getDescriptorCount(); descIndex++) {
Silvio Lucio Oliva 70:d20d30f59b1c 210 GattAttribute *descriptor = p_char->getDescriptor(descIndex);
Silvio Lucio Oliva 70:d20d30f59b1c 211 uint16_t shortUUID = descriptor->getUUID().getShortUUID();
Silvio Lucio Oliva 70:d20d30f59b1c 212 const uint8_t uuidArray[] = {(shortUUID>>8)&0xFF, (shortUUID&0xFF)};
Silvio Lucio Oliva 70:d20d30f59b1c 213 ret = aci_gatt_add_char_desc(service.getHandle(), p_char->getValueAttribute().getHandle(),
Silvio Lucio Oliva 70:d20d30f59b1c 214 CHAR_DESC_TYPE_16_BIT, uuidArray, descriptor->getMaxLength(), descriptor->getInitialLength(),
Silvio Lucio Oliva 70:d20d30f59b1c 215 descriptor->getValuePtr(), CHAR_DESC_SECURITY_PERMISSION, CHAR_DESC_ACCESS_PERMISSION, GATT_NOTIFY_ATTRIBUTE_WRITE,
Silvio Lucio Oliva 70:d20d30f59b1c 216 MIN_ENCRY_KEY_SIZE, CHAR_ATTRIBUTE_LEN_IS_FIXED, &descHandle);
apalmieri 84:2beeb1cc9d57 217 DEBUG("Adding Descriptor descriptor handle=%d ret=%d\n\r", descHandle, ret);
Silvio Lucio Oliva 70:d20d30f59b1c 218 if(ret==(tBleStatus)0) {
Silvio Lucio Oliva 70:d20d30f59b1c 219 DEBUG("Descriptor added successfully, descriptor handle=%d\n\r", descHandle);
Silvio Lucio Oliva 70:d20d30f59b1c 220 descriptor->setHandle(descHandle);
Silvio Lucio Oliva 70:d20d30f59b1c 221 }
Silvio Lucio Oliva 70:d20d30f59b1c 222 }
Andrea Palmieri 73:142f3ded2091 223
Silvio Lucio Oliva 70:d20d30f59b1c 224 }
Silvio Lucio Oliva 70:d20d30f59b1c 225
Silvio Lucio Oliva 70:d20d30f59b1c 226 serviceCount++;
Silvio Lucio Oliva 70:d20d30f59b1c 227
Silvio Lucio Oliva 70:d20d30f59b1c 228 //FIXME: There is no GattService pointer array in GattServer.
Silvio Lucio Oliva 70:d20d30f59b1c 229 // There should be one? (Only the user is aware of GattServices!) Report to forum.
Silvio Lucio Oliva 70:d20d30f59b1c 230
Silvio Lucio Oliva 70:d20d30f59b1c 231 return BLE_ERROR_NONE;
Silvio Lucio Oliva 70:d20d30f59b1c 232 }
Silvio Lucio Oliva 70:d20d30f59b1c 233
Silvio Lucio Oliva 70:d20d30f59b1c 234 /**************************************************************************/
Silvio Lucio Oliva 70:d20d30f59b1c 235 /*!
Silvio Lucio Oliva 70:d20d30f59b1c 236 @brief Reads the value of a characteristic, based on the service
Silvio Lucio Oliva 70:d20d30f59b1c 237 and characteristic index fields
Silvio Lucio Oliva 70:d20d30f59b1c 238
Silvio Lucio Oliva 70:d20d30f59b1c 239 @param[in] charHandle
Silvio Lucio Oliva 70:d20d30f59b1c 240 The handle of the GattCharacteristic to read from
Silvio Lucio Oliva 70:d20d30f59b1c 241 @param[in] buffer
Silvio Lucio Oliva 70:d20d30f59b1c 242 Buffer to hold the the characteristic's value
Silvio Lucio Oliva 70:d20d30f59b1c 243 (raw byte array in LSB format)
Silvio Lucio Oliva 70:d20d30f59b1c 244 @param[in] lengthP
Silvio Lucio Oliva 70:d20d30f59b1c 245 The number of bytes read into the buffer
Silvio Lucio Oliva 70:d20d30f59b1c 246
Silvio Lucio Oliva 70:d20d30f59b1c 247 @returns ble_error_t
Silvio Lucio Oliva 70:d20d30f59b1c 248
Silvio Lucio Oliva 70:d20d30f59b1c 249 @retval BLE_ERROR_NONE
Silvio Lucio Oliva 70:d20d30f59b1c 250 Everything executed properly
Silvio Lucio Oliva 70:d20d30f59b1c 251
Silvio Lucio Oliva 70:d20d30f59b1c 252 @section EXAMPLE
Silvio Lucio Oliva 70:d20d30f59b1c 253
Silvio Lucio Oliva 70:d20d30f59b1c 254 @code
Silvio Lucio Oliva 70:d20d30f59b1c 255
Silvio Lucio Oliva 70:d20d30f59b1c 256 @endcode
Silvio Lucio Oliva 70:d20d30f59b1c 257 */
Silvio Lucio Oliva 70:d20d30f59b1c 258 /**************************************************************************/
Silvio Lucio Oliva 70:d20d30f59b1c 259 ble_error_t BlueNRGGattServer::readValue(uint16_t charHandle, uint8_t buffer[], uint16_t *const lengthP)
Silvio Lucio Oliva 70:d20d30f59b1c 260 {
Silvio Lucio Oliva 70:d20d30f59b1c 261 DEBUG("ReadValue() Not Supported\n\r");
Silvio Lucio Oliva 70:d20d30f59b1c 262 return BLE_ERROR_NONE;
Silvio Lucio Oliva 70:d20d30f59b1c 263 }
Silvio Lucio Oliva 70:d20d30f59b1c 264
Silvio Lucio Oliva 70:d20d30f59b1c 265 /**************************************************************************/
Silvio Lucio Oliva 70:d20d30f59b1c 266 /*!
Silvio Lucio Oliva 70:d20d30f59b1c 267 @brief Updates the value of a characteristic, based on the service
Silvio Lucio Oliva 70:d20d30f59b1c 268 and characteristic index fields
Silvio Lucio Oliva 70:d20d30f59b1c 269
Silvio Lucio Oliva 70:d20d30f59b1c 270 @param[in] charHandle
Silvio Lucio Oliva 70:d20d30f59b1c 271 The handle of the GattCharacteristic to write to
Silvio Lucio Oliva 70:d20d30f59b1c 272 @param[in] buffer
Silvio Lucio Oliva 70:d20d30f59b1c 273 Data to use when updating the characteristic's value
Silvio Lucio Oliva 70:d20d30f59b1c 274 (raw byte array in LSB format)
Silvio Lucio Oliva 70:d20d30f59b1c 275 @param[in] len
Silvio Lucio Oliva 70:d20d30f59b1c 276 The number of bytes in buffer
Silvio Lucio Oliva 70:d20d30f59b1c 277
Silvio Lucio Oliva 70:d20d30f59b1c 278 @returns ble_error_t
Silvio Lucio Oliva 70:d20d30f59b1c 279
Silvio Lucio Oliva 70:d20d30f59b1c 280 @retval BLE_ERROR_NONE
Silvio Lucio Oliva 70:d20d30f59b1c 281 Everything executed properly
Silvio Lucio Oliva 70:d20d30f59b1c 282
Silvio Lucio Oliva 70:d20d30f59b1c 283 @section EXAMPLE
Silvio Lucio Oliva 70:d20d30f59b1c 284
Silvio Lucio Oliva 70:d20d30f59b1c 285 @code
Silvio Lucio Oliva 70:d20d30f59b1c 286
Silvio Lucio Oliva 70:d20d30f59b1c 287 @endcode
Silvio Lucio Oliva 70:d20d30f59b1c 288 */
Silvio Lucio Oliva 70:d20d30f59b1c 289 /**************************************************************************/
Silvio Lucio Oliva 70:d20d30f59b1c 290 // <<<ANDREA>>>
Silvio Lucio Oliva 70:d20d30f59b1c 291 ble_error_t BlueNRGGattServer::readValue(Gap::Handle_t connectionHandle, GattAttribute::Handle_t attributeHandle, uint8_t buffer[], uint16_t *lengthP) {
Silvio Lucio Oliva 70:d20d30f59b1c 292 // Empty by now
Silvio Lucio Oliva 70:d20d30f59b1c 293 return BLE_ERROR_NONE;
Silvio Lucio Oliva 70:d20d30f59b1c 294 }
Silvio Lucio Oliva 70:d20d30f59b1c 295
Andrea Palmieri 77:332b416123b4 296 ble_error_t BlueNRGGattServer::write(Gap::Handle_t connectionHandle, GattAttribute::Handle_t, const uint8_t[], uint16_t, bool localOnly) {
Silvio Lucio Oliva 70:d20d30f59b1c 297 // Empty by now
Silvio Lucio Oliva 70:d20d30f59b1c 298 return BLE_ERROR_NONE;
Silvio Lucio Oliva 70:d20d30f59b1c 299 }
Silvio Lucio Oliva 70:d20d30f59b1c 300
Andrea Palmieri 77:332b416123b4 301 ble_error_t BlueNRGGattServer::write(GattAttribute::Handle_t charHandle, const uint8_t buffer[], uint16_t len, bool localOnly)
Silvio Lucio Oliva 70:d20d30f59b1c 302 {
Silvio Lucio Oliva 70:d20d30f59b1c 303 tBleStatus ret;
Andrea Palmieri 77:332b416123b4 304 //uint8_t buff[2];
Silvio Lucio Oliva 70:d20d30f59b1c 305
Silvio Lucio Oliva 70:d20d30f59b1c 306 DEBUG("updating bleCharacteristic charHandle =%u, corresponding serviceHanle= %u len=%d\n\r", charHandle, bleCharHanldeMap.find(charHandle)->second, len);
Silvio Lucio Oliva 70:d20d30f59b1c 307 /*
Silvio Lucio Oliva 70:d20d30f59b1c 308 for(int i=0; i<6; i++) {
Silvio Lucio Oliva 70:d20d30f59b1c 309 DEBUG("buffer[%d]=%d\n\r", i, buffer[i]);
Silvio Lucio Oliva 70:d20d30f59b1c 310 }
Silvio Lucio Oliva 70:d20d30f59b1c 311 */
Silvio Lucio Oliva 70:d20d30f59b1c 312 ret = aci_gatt_update_char_value(bleCharHanldeMap.find(charHandle)->second, charHandle, 0, len, buffer);
Silvio Lucio Oliva 70:d20d30f59b1c 313
Silvio Lucio Oliva 70:d20d30f59b1c 314 if (ret != BLE_STATUS_SUCCESS){
Silvio Lucio Oliva 70:d20d30f59b1c 315 DEBUG("Error while updating characteristic.\n\r") ;
Silvio Lucio Oliva 70:d20d30f59b1c 316 return BLE_ERROR_PARAM_OUT_OF_RANGE ; //Not correct Error Value
Silvio Lucio Oliva 70:d20d30f59b1c 317 //FIXME: Define Error values equivalent to BlueNRG Error Codes.
Silvio Lucio Oliva 70:d20d30f59b1c 318 }
Silvio Lucio Oliva 70:d20d30f59b1c 319
Silvio Lucio Oliva 70:d20d30f59b1c 320 //Generate Data Sent Event Here? (GattServerEvents::GATT_EVENT_DATA_SENT) //FIXME: Is this correct?
Silvio Lucio Oliva 70:d20d30f59b1c 321 //Check if characteristic property is NOTIFY|INDICATE, if yes generate event
Silvio Lucio Oliva 70:d20d30f59b1c 322 GattCharacteristic *p_char = BlueNRGGattServer::getInstance().getCharacteristicFromHandle(charHandle);
Silvio Lucio Oliva 70:d20d30f59b1c 323 if(p_char->getProperties() & (GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_NOTIFY
Silvio Lucio Oliva 70:d20d30f59b1c 324 | GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_INDICATE)) {
Silvio Lucio Oliva 70:d20d30f59b1c 325 BlueNRGGattServer::getInstance().handleEvent(GattServerEvents::GATT_EVENT_DATA_SENT, charHandle);
Silvio Lucio Oliva 70:d20d30f59b1c 326 }
Silvio Lucio Oliva 70:d20d30f59b1c 327
Silvio Lucio Oliva 70:d20d30f59b1c 328 return BLE_ERROR_NONE;
Silvio Lucio Oliva 70:d20d30f59b1c 329 }
Silvio Lucio Oliva 70:d20d30f59b1c 330
Silvio Lucio Oliva 70:d20d30f59b1c 331 /**************************************************************************/
Silvio Lucio Oliva 70:d20d30f59b1c 332 /*!
Silvio Lucio Oliva 70:d20d30f59b1c 333 @brief Reads a value according to the handle provided
Silvio Lucio Oliva 70:d20d30f59b1c 334
Silvio Lucio Oliva 70:d20d30f59b1c 335 @param[in] charHandle
Silvio Lucio Oliva 70:d20d30f59b1c 336 The handle of the GattCharacteristic to read from
Silvio Lucio Oliva 70:d20d30f59b1c 337
Silvio Lucio Oliva 70:d20d30f59b1c 338 @returns ble_error_t
Silvio Lucio Oliva 70:d20d30f59b1c 339
Silvio Lucio Oliva 70:d20d30f59b1c 340 @retval BLE_ERROR_NONE
Silvio Lucio Oliva 70:d20d30f59b1c 341 Everything executed properly
Silvio Lucio Oliva 70:d20d30f59b1c 342
Silvio Lucio Oliva 70:d20d30f59b1c 343 @section EXAMPLE
Silvio Lucio Oliva 70:d20d30f59b1c 344
Silvio Lucio Oliva 70:d20d30f59b1c 345 @code
Silvio Lucio Oliva 70:d20d30f59b1c 346
Silvio Lucio Oliva 70:d20d30f59b1c 347 @endcode
Silvio Lucio Oliva 70:d20d30f59b1c 348 */
Silvio Lucio Oliva 70:d20d30f59b1c 349 /**************************************************************************/
Silvio Lucio Oliva 70:d20d30f59b1c 350 ble_error_t BlueNRGGattServer::Read_Request_CB(uint16_t handle)
Silvio Lucio Oliva 70:d20d30f59b1c 351 {
Silvio Lucio Oliva 70:d20d30f59b1c 352 //signed short refvalue;
Silvio Lucio Oliva 70:d20d30f59b1c 353 uint16_t gapConnectionHandle = BlueNRGGap::getInstance().getConnectionHandle();
Silvio Lucio Oliva 70:d20d30f59b1c 354
Andrea Palmieri 77:332b416123b4 355 GattReadCallbackParams readParams;
Andrea Palmieri 77:332b416123b4 356 readParams.handle = handle;
Silvio Lucio Oliva 70:d20d30f59b1c 357
Silvio Lucio Oliva 70:d20d30f59b1c 358 //DEBUG("readParams.charHandle = %d\n\r", readParams.charHandle);
Silvio Lucio Oliva 70:d20d30f59b1c 359 HCIDataReadEvent(&readParams);
Silvio Lucio Oliva 70:d20d30f59b1c 360
Silvio Lucio Oliva 70:d20d30f59b1c 361 //EXIT:
Silvio Lucio Oliva 70:d20d30f59b1c 362 if(gapConnectionHandle != 0){
Silvio Lucio Oliva 70:d20d30f59b1c 363 //DEBUG("Calling aci_gatt_allow_read\n\r");
Silvio Lucio Oliva 70:d20d30f59b1c 364 aci_gatt_allow_read(gapConnectionHandle);
Silvio Lucio Oliva 70:d20d30f59b1c 365 }
Andrea Palmieri 77:332b416123b4 366
Andrea Palmieri 77:332b416123b4 367 return BLE_ERROR_NONE;
Silvio Lucio Oliva 70:d20d30f59b1c 368 }
Silvio Lucio Oliva 70:d20d30f59b1c 369
Silvio Lucio Oliva 70:d20d30f59b1c 370 /**************************************************************************/
Silvio Lucio Oliva 70:d20d30f59b1c 371 /*!
Silvio Lucio Oliva 70:d20d30f59b1c 372 @brief Returns the GattCharacteristic according to the handle provided
Silvio Lucio Oliva 70:d20d30f59b1c 373
Silvio Lucio Oliva 70:d20d30f59b1c 374 @param[in] charHandle
Silvio Lucio Oliva 70:d20d30f59b1c 375 The handle of the GattCharacteristic
Silvio Lucio Oliva 70:d20d30f59b1c 376
Silvio Lucio Oliva 70:d20d30f59b1c 377 @returns ble_error_t
Silvio Lucio Oliva 70:d20d30f59b1c 378
Silvio Lucio Oliva 70:d20d30f59b1c 379 @retval BLE_ERROR_NONE
Silvio Lucio Oliva 70:d20d30f59b1c 380 Everything executed properly
Silvio Lucio Oliva 70:d20d30f59b1c 381
Silvio Lucio Oliva 70:d20d30f59b1c 382 @section EXAMPLE
Silvio Lucio Oliva 70:d20d30f59b1c 383
Silvio Lucio Oliva 70:d20d30f59b1c 384 @code
Silvio Lucio Oliva 70:d20d30f59b1c 385
Silvio Lucio Oliva 70:d20d30f59b1c 386 @endcode
Silvio Lucio Oliva 70:d20d30f59b1c 387 */
Silvio Lucio Oliva 70:d20d30f59b1c 388 /**************************************************************************/
Silvio Lucio Oliva 70:d20d30f59b1c 389 GattCharacteristic* BlueNRGGattServer::getCharacteristicFromHandle(uint16_t attrHandle)
Silvio Lucio Oliva 70:d20d30f59b1c 390 {
Silvio Lucio Oliva 70:d20d30f59b1c 391 GattCharacteristic *p_char = NULL;
Silvio Lucio Oliva 70:d20d30f59b1c 392 int i;
Silvio Lucio Oliva 70:d20d30f59b1c 393 uint16_t handle;
Silvio Lucio Oliva 70:d20d30f59b1c 394
Silvio Lucio Oliva 70:d20d30f59b1c 395 //DEBUG("BlueNRGGattServer::getCharacteristicFromHandle()>>Attribute Handle received 0x%x\n\r",attrHandle);
Silvio Lucio Oliva 70:d20d30f59b1c 396 for(i=0; i<characteristicCount; i++)
Silvio Lucio Oliva 70:d20d30f59b1c 397 {
Silvio Lucio Oliva 70:d20d30f59b1c 398 handle = p_characteristics[i]->getValueAttribute().getHandle();
apalmieri 84:2beeb1cc9d57 399 //DEBUG("Found p_characteristics[%d] handle=%u Properties 0x%x\n\r", i, handle, p_characteristics[i]->getProperties());
apalmieri 84:2beeb1cc9d57 400 /*
Silvio Lucio Oliva 70:d20d30f59b1c 401 if(i==characteristicCount-1)//Last Characteristic check
Silvio Lucio Oliva 70:d20d30f59b1c 402 {
Silvio Lucio Oliva 70:d20d30f59b1c 403 if(attrHandle>=bleCharacteristicHandles[handle])
Silvio Lucio Oliva 70:d20d30f59b1c 404 {
Silvio Lucio Oliva 70:d20d30f59b1c 405 p_char = p_characteristics[i];
Silvio Lucio Oliva 70:d20d30f59b1c 406 DEBUG("Found Characteristic Properties 0x%x\n\r",p_char->getProperties());
Silvio Lucio Oliva 70:d20d30f59b1c 407 break;
Silvio Lucio Oliva 70:d20d30f59b1c 408 }
Silvio Lucio Oliva 70:d20d30f59b1c 409 }
Silvio Lucio Oliva 70:d20d30f59b1c 410 else {
Silvio Lucio Oliva 70:d20d30f59b1c 411 //Testing if attribute handle is between two Characteristic Handles
Silvio Lucio Oliva 70:d20d30f59b1c 412 if(attrHandle>=bleCharacteristicHandles[handle] && attrHandle<bleCharacteristicHandles[handle+1])
Silvio Lucio Oliva 70:d20d30f59b1c 413 {
Silvio Lucio Oliva 70:d20d30f59b1c 414 p_char = p_characteristics[i];
apalmieri 84:2beeb1cc9d57 415 DEBUG("Found Characteristic Properties 0x%x\n\r",p_char->getProperties());
Silvio Lucio Oliva 70:d20d30f59b1c 416 break;
Silvio Lucio Oliva 70:d20d30f59b1c 417 } else continue;
Silvio Lucio Oliva 70:d20d30f59b1c 418 }
apalmieri 84:2beeb1cc9d57 419 */
apalmieri 84:2beeb1cc9d57 420 if(attrHandle == handle) {
apalmieri 84:2beeb1cc9d57 421 p_char = p_characteristics[i];
apalmieri 84:2beeb1cc9d57 422 DEBUG("Found Characteristic Properties 0x%x\n\r",p_char->getProperties());
apalmieri 84:2beeb1cc9d57 423 break;
apalmieri 84:2beeb1cc9d57 424 }
Silvio Lucio Oliva 70:d20d30f59b1c 425 }
Silvio Lucio Oliva 70:d20d30f59b1c 426
Silvio Lucio Oliva 70:d20d30f59b1c 427 return p_char;
Silvio Lucio Oliva 70:d20d30f59b1c 428 }
Silvio Lucio Oliva 70:d20d30f59b1c 429
Andrea Palmieri 77:332b416123b4 430 void BlueNRGGattServer::HCIDataWrittenEvent(const GattWriteCallbackParams *params) {
Silvio Lucio Oliva 70:d20d30f59b1c 431 this->handleDataWrittenEvent(params);
Silvio Lucio Oliva 70:d20d30f59b1c 432 }
Silvio Lucio Oliva 70:d20d30f59b1c 433
Andrea Palmieri 77:332b416123b4 434 void BlueNRGGattServer::HCIDataReadEvent(const GattReadCallbackParams *params) {
Andrea Palmieri 73:142f3ded2091 435 DEBUG("Called HCIDataReadEvent\n\r");
Silvio Lucio Oliva 70:d20d30f59b1c 436 this->handleDataReadEvent(params);
Silvio Lucio Oliva 70:d20d30f59b1c 437 }
Silvio Lucio Oliva 70:d20d30f59b1c 438
Silvio Lucio Oliva 70:d20d30f59b1c 439 void BlueNRGGattServer::HCIEvent(GattServerEvents::gattEvent_e type, uint16_t charHandle) {
Silvio Lucio Oliva 70:d20d30f59b1c 440 this->handleEvent(type, charHandle);
Silvio Lucio Oliva 70:d20d30f59b1c 441 }
Silvio Lucio Oliva 70:d20d30f59b1c 442
Silvio Lucio Oliva 70:d20d30f59b1c 443 void BlueNRGGattServer::HCIDataSentEvent(unsigned count) {
Silvio Lucio Oliva 70:d20d30f59b1c 444 this->handleDataSentEvent(count);
Silvio Lucio Oliva 70:d20d30f59b1c 445 }
Silvio Lucio Oliva 70:d20d30f59b1c 446
Silvio Lucio Oliva 70:d20d30f59b1c 447
Silvio Lucio Oliva 70:d20d30f59b1c 448 ble_error_t BlueNRGGattServer::initializeGATTDatabase(void) {
Silvio Lucio Oliva 70:d20d30f59b1c 449 // <TODO>
Silvio Lucio Oliva 70:d20d30f59b1c 450 return (ble_error_t)0;
Silvio Lucio Oliva 70:d20d30f59b1c 451 }