Previous version which works for my stm32f401 Nucleo board

Fork of X_NUCLEO_IDB0XA1 by ST

Committer:
Silvio Lucio Oliva
Date:
Mon Jun 08 17:08:01 2015 +0200
Revision:
70:d20d30f59b1c
Child:
73:142f3ded2091
Initial commit for mbed support

Signed-off-by: Silvio Lucio Oliva <silvio.oliva@st.com>

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
Silvio Lucio Oliva 70:d20d30f59b1c 81 type = (service.getUUID()).shortOrLong();
Silvio Lucio Oliva 70:d20d30f59b1c 82 DEBUG("AddService(): Type:%d\n\r", type);
Silvio Lucio Oliva 70:d20d30f59b1c 83
Silvio Lucio Oliva 70:d20d30f59b1c 84 /* Add the service to the BlueNRG */
Silvio Lucio Oliva 70:d20d30f59b1c 85 short_uuid = (service.getUUID()).getShortUUID();
Silvio Lucio Oliva 70:d20d30f59b1c 86 STORE_LE_16(primary_short_uuid, short_uuid);
Silvio Lucio Oliva 70:d20d30f59b1c 87
Silvio Lucio Oliva 70:d20d30f59b1c 88 if(type==UUID::UUID_TYPE_LONG) {
Silvio Lucio Oliva 70:d20d30f59b1c 89 base_uuid = (service.getUUID()).getBaseUUID();
Silvio Lucio Oliva 70:d20d30f59b1c 90
Silvio Lucio Oliva 70:d20d30f59b1c 91 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 92 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 93 }
Silvio Lucio Oliva 70:d20d30f59b1c 94
Silvio Lucio Oliva 70:d20d30f59b1c 95 if(type==UUID::UUID_TYPE_SHORT) {
Silvio Lucio Oliva 70:d20d30f59b1c 96 ret = aci_gatt_add_serv(UUID_TYPE_16, primary_short_uuid, PRIMARY_SERVICE, 7,
Silvio Lucio Oliva 70:d20d30f59b1c 97 &servHandle);
Silvio Lucio Oliva 70:d20d30f59b1c 98 }
Silvio Lucio Oliva 70:d20d30f59b1c 99 else if(type==UUID::UUID_TYPE_LONG) {
Silvio Lucio Oliva 70:d20d30f59b1c 100 ret = aci_gatt_add_serv(UUID_TYPE_128, primary_base_uuid, PRIMARY_SERVICE, 7,
Silvio Lucio Oliva 70:d20d30f59b1c 101 &servHandle);
Silvio Lucio Oliva 70:d20d30f59b1c 102 }
Silvio Lucio Oliva 70:d20d30f59b1c 103
Silvio Lucio Oliva 70:d20d30f59b1c 104 service.setHandle(servHandle);
Silvio Lucio Oliva 70:d20d30f59b1c 105 //serviceHandleVector.push_back(servHandle);
Silvio Lucio Oliva 70:d20d30f59b1c 106 DEBUG("added servHandle handle =%u\n\r", servHandle);
Silvio Lucio Oliva 70:d20d30f59b1c 107 uint16_t bleCharacteristic;
Silvio Lucio Oliva 70:d20d30f59b1c 108
Silvio Lucio Oliva 70:d20d30f59b1c 109 //iterate to include all characteristics
Silvio Lucio Oliva 70:d20d30f59b1c 110 for (uint8_t i = 0; i < service.getCharacteristicCount(); i++) {
Silvio Lucio Oliva 70:d20d30f59b1c 111 GattCharacteristic *p_char = service.getCharacteristic(i);
Silvio Lucio Oliva 70:d20d30f59b1c 112 uint16_t char_uuid = (p_char->getValueAttribute().getUUID()).getShortUUID();
Silvio Lucio Oliva 70:d20d30f59b1c 113
Silvio Lucio Oliva 70:d20d30f59b1c 114 uint8_t int_8_uuid[2];
Silvio Lucio Oliva 70:d20d30f59b1c 115 STORE_LE_16(int_8_uuid, char_uuid);
Silvio Lucio Oliva 70:d20d30f59b1c 116
Silvio Lucio Oliva 70:d20d30f59b1c 117 if(type==UUID::UUID_TYPE_LONG) {
Silvio Lucio Oliva 70:d20d30f59b1c 118 base_char_uuid = (p_char->getValueAttribute().getUUID()).getBaseUUID();
Silvio Lucio Oliva 70:d20d30f59b1c 119
Silvio Lucio Oliva 70:d20d30f59b1c 120 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 121 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 122 }
Silvio Lucio Oliva 70:d20d30f59b1c 123
Silvio Lucio Oliva 70:d20d30f59b1c 124 DEBUG("Char Properties 0x%x\n\r", p_char->getProperties());
Silvio Lucio Oliva 70:d20d30f59b1c 125 /*
Silvio Lucio Oliva 70:d20d30f59b1c 126 * Gatt_Evt_Mask -> HardCoded (0)
Silvio Lucio Oliva 70:d20d30f59b1c 127 * Encryption_Key_Size -> Hardcoded (16)
Silvio Lucio Oliva 70:d20d30f59b1c 128 * isVariable (variable length value field) -> Hardcoded (1)
Silvio Lucio Oliva 70:d20d30f59b1c 129 */
Silvio Lucio Oliva 70:d20d30f59b1c 130 uint8_t Gatt_Evt_Mask = 0x0;
Silvio Lucio Oliva 70:d20d30f59b1c 131
Silvio Lucio Oliva 70:d20d30f59b1c 132 if((p_char->getProperties() &
Silvio Lucio Oliva 70:d20d30f59b1c 133 (GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_WRITE_WITHOUT_RESPONSE|
Silvio Lucio Oliva 70:d20d30f59b1c 134 GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_WRITE))) {
Silvio Lucio Oliva 70:d20d30f59b1c 135 DEBUG("Setting up Gatt GATT_NOTIFY_ATTRIBUTE_WRITE Mask\n\r");
Silvio Lucio Oliva 70:d20d30f59b1c 136 Gatt_Evt_Mask = Gatt_Evt_Mask | GATT_NOTIFY_ATTRIBUTE_WRITE;
Silvio Lucio Oliva 70:d20d30f59b1c 137
Silvio Lucio Oliva 70:d20d30f59b1c 138 // ANDREA -- FIXME: HR control point char is not correctly handled
Silvio Lucio Oliva 70:d20d30f59b1c 139 continue;
Silvio Lucio Oliva 70:d20d30f59b1c 140 }
Silvio Lucio Oliva 70:d20d30f59b1c 141 if((p_char->getProperties() &
Silvio Lucio Oliva 70:d20d30f59b1c 142 (GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_READ|
Silvio Lucio Oliva 70:d20d30f59b1c 143 GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_NOTIFY| GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_INDICATE))) {
Silvio Lucio Oliva 70:d20d30f59b1c 144 DEBUG("Setting up Gatt GATT_NOTIFY_READ_REQ_AND_WAIT_FOR_APPL_RESP Mask\n\r");
Silvio Lucio Oliva 70:d20d30f59b1c 145 Gatt_Evt_Mask = Gatt_Evt_Mask | GATT_NOTIFY_READ_REQ_AND_WAIT_FOR_APPL_RESP;
Silvio Lucio Oliva 70:d20d30f59b1c 146 } //This will support also GATT_SERVER_ATTR_READ_WRITE since it will be covered by previous if() check.
Silvio Lucio Oliva 70:d20d30f59b1c 147
Silvio Lucio Oliva 70:d20d30f59b1c 148 if(type==UUID::UUID_TYPE_SHORT) {
Silvio Lucio Oliva 70:d20d30f59b1c 149 ret = aci_gatt_add_char(service.getHandle(), UUID_TYPE_16, int_8_uuid, p_char->getValueAttribute().getMaxLength() /*2*/ /*Value Length*/,
Silvio Lucio Oliva 70:d20d30f59b1c 150 p_char->getProperties(), ATTR_PERMISSION_NONE, Gatt_Evt_Mask /*Gatt_Evt_Mask*/,
Silvio Lucio Oliva 70:d20d30f59b1c 151 16 /*Encryption_Key_Size*/, 1 /*isVariable*/, &bleCharacteristic);
Silvio Lucio Oliva 70:d20d30f59b1c 152 }
Silvio Lucio Oliva 70:d20d30f59b1c 153 else if(type==UUID::UUID_TYPE_LONG) {
Silvio Lucio Oliva 70:d20d30f59b1c 154 ret = aci_gatt_add_char(service.getHandle(), UUID_TYPE_128, char_base_uuid, p_char->getValueAttribute().getMaxLength() /*2*/ /*Value Length*/,
Silvio Lucio Oliva 70:d20d30f59b1c 155 p_char->getProperties(), ATTR_PERMISSION_NONE, Gatt_Evt_Mask /*Gatt_Evt_Mask*/,
Silvio Lucio Oliva 70:d20d30f59b1c 156 16 /*Encryption_Key_Size*/, 1 /*isVariable*/, &bleCharacteristic);
Silvio Lucio Oliva 70:d20d30f59b1c 157 }
Silvio Lucio Oliva 70:d20d30f59b1c 158 /* Update the characteristic handle */
Silvio Lucio Oliva 70:d20d30f59b1c 159 uint16_t charHandle = characteristicCount;
Silvio Lucio Oliva 70:d20d30f59b1c 160
Silvio Lucio Oliva 70:d20d30f59b1c 161 bleCharHanldeMap.insert(std::pair<uint16_t, uint16_t>(bleCharacteristic, servHandle));
Silvio Lucio Oliva 70:d20d30f59b1c 162
Silvio Lucio Oliva 70:d20d30f59b1c 163 p_characteristics[characteristicCount++] = p_char;
Silvio Lucio Oliva 70:d20d30f59b1c 164 p_char->getValueAttribute().setHandle(bleCharacteristic); //Set the characteristic count as the corresponding char handle
Silvio Lucio Oliva 70:d20d30f59b1c 165 DEBUG("added bleCharacteristic handle =%u\n\r", bleCharacteristic);
Silvio Lucio Oliva 70:d20d30f59b1c 166
Silvio Lucio Oliva 70:d20d30f59b1c 167 if ((p_char->getValueAttribute().getValuePtr() != NULL) && (p_char->getValueAttribute().getInitialLength() > 0)) {
Silvio Lucio Oliva 70:d20d30f59b1c 168 updateValue(p_char->getValueAttribute().getHandle(), p_char->getValueAttribute().getValuePtr(), p_char->getValueAttribute().getInitialLength(), false /* localOnly */);
Silvio Lucio Oliva 70:d20d30f59b1c 169 }
Silvio Lucio Oliva 70:d20d30f59b1c 170
Silvio Lucio Oliva 70:d20d30f59b1c 171 // add descriptors now
Silvio Lucio Oliva 70:d20d30f59b1c 172 uint16_t descHandle = 0;
Silvio Lucio Oliva 70:d20d30f59b1c 173 for(uint8_t descIndex=0; descIndex<p_char->getDescriptorCount(); descIndex++) {
Silvio Lucio Oliva 70:d20d30f59b1c 174 GattAttribute *descriptor = p_char->getDescriptor(descIndex);
Silvio Lucio Oliva 70:d20d30f59b1c 175 uint16_t shortUUID = descriptor->getUUID().getShortUUID();
Silvio Lucio Oliva 70:d20d30f59b1c 176 const uint8_t uuidArray[] = {(shortUUID>>8)&0xFF, (shortUUID&0xFF)};
Silvio Lucio Oliva 70:d20d30f59b1c 177 ret = aci_gatt_add_char_desc(service.getHandle(), p_char->getValueAttribute().getHandle(),
Silvio Lucio Oliva 70:d20d30f59b1c 178 CHAR_DESC_TYPE_16_BIT, uuidArray, descriptor->getMaxLength(), descriptor->getInitialLength(),
Silvio Lucio Oliva 70:d20d30f59b1c 179 descriptor->getValuePtr(), CHAR_DESC_SECURITY_PERMISSION, CHAR_DESC_ACCESS_PERMISSION, GATT_NOTIFY_ATTRIBUTE_WRITE,
Silvio Lucio Oliva 70:d20d30f59b1c 180 MIN_ENCRY_KEY_SIZE, CHAR_ATTRIBUTE_LEN_IS_FIXED, &descHandle);
Silvio Lucio Oliva 70:d20d30f59b1c 181 if(ret==(tBleStatus)0) {
Silvio Lucio Oliva 70:d20d30f59b1c 182 DEBUG("Descriptor added successfully, descriptor handle=%d\n\r", descHandle);
Silvio Lucio Oliva 70:d20d30f59b1c 183 descriptor->setHandle(descHandle);
Silvio Lucio Oliva 70:d20d30f59b1c 184 }
Silvio Lucio Oliva 70:d20d30f59b1c 185 }
Silvio Lucio Oliva 70:d20d30f59b1c 186 }
Silvio Lucio Oliva 70:d20d30f59b1c 187
Silvio Lucio Oliva 70:d20d30f59b1c 188 serviceCount++;
Silvio Lucio Oliva 70:d20d30f59b1c 189
Silvio Lucio Oliva 70:d20d30f59b1c 190 //FIXME: There is no GattService pointer array in GattServer.
Silvio Lucio Oliva 70:d20d30f59b1c 191 // There should be one? (Only the user is aware of GattServices!) Report to forum.
Silvio Lucio Oliva 70:d20d30f59b1c 192
Silvio Lucio Oliva 70:d20d30f59b1c 193 return BLE_ERROR_NONE;
Silvio Lucio Oliva 70:d20d30f59b1c 194 }
Silvio Lucio Oliva 70:d20d30f59b1c 195
Silvio Lucio Oliva 70:d20d30f59b1c 196 /**************************************************************************/
Silvio Lucio Oliva 70:d20d30f59b1c 197 /*!
Silvio Lucio Oliva 70:d20d30f59b1c 198 @brief Reads the value of a characteristic, based on the service
Silvio Lucio Oliva 70:d20d30f59b1c 199 and characteristic index fields
Silvio Lucio Oliva 70:d20d30f59b1c 200
Silvio Lucio Oliva 70:d20d30f59b1c 201 @param[in] charHandle
Silvio Lucio Oliva 70:d20d30f59b1c 202 The handle of the GattCharacteristic to read from
Silvio Lucio Oliva 70:d20d30f59b1c 203 @param[in] buffer
Silvio Lucio Oliva 70:d20d30f59b1c 204 Buffer to hold the the characteristic's value
Silvio Lucio Oliva 70:d20d30f59b1c 205 (raw byte array in LSB format)
Silvio Lucio Oliva 70:d20d30f59b1c 206 @param[in] lengthP
Silvio Lucio Oliva 70:d20d30f59b1c 207 The number of bytes read into the buffer
Silvio Lucio Oliva 70:d20d30f59b1c 208
Silvio Lucio Oliva 70:d20d30f59b1c 209 @returns ble_error_t
Silvio Lucio Oliva 70:d20d30f59b1c 210
Silvio Lucio Oliva 70:d20d30f59b1c 211 @retval BLE_ERROR_NONE
Silvio Lucio Oliva 70:d20d30f59b1c 212 Everything executed properly
Silvio Lucio Oliva 70:d20d30f59b1c 213
Silvio Lucio Oliva 70:d20d30f59b1c 214 @section EXAMPLE
Silvio Lucio Oliva 70:d20d30f59b1c 215
Silvio Lucio Oliva 70:d20d30f59b1c 216 @code
Silvio Lucio Oliva 70:d20d30f59b1c 217
Silvio Lucio Oliva 70:d20d30f59b1c 218 @endcode
Silvio Lucio Oliva 70:d20d30f59b1c 219 */
Silvio Lucio Oliva 70:d20d30f59b1c 220 /**************************************************************************/
Silvio Lucio Oliva 70:d20d30f59b1c 221 ble_error_t BlueNRGGattServer::readValue(uint16_t charHandle, uint8_t buffer[], uint16_t *const lengthP)
Silvio Lucio Oliva 70:d20d30f59b1c 222 {
Silvio Lucio Oliva 70:d20d30f59b1c 223 DEBUG("ReadValue() Not Supported\n\r");
Silvio Lucio Oliva 70:d20d30f59b1c 224 return BLE_ERROR_NONE;
Silvio Lucio Oliva 70:d20d30f59b1c 225 }
Silvio Lucio Oliva 70:d20d30f59b1c 226
Silvio Lucio Oliva 70:d20d30f59b1c 227 /**************************************************************************/
Silvio Lucio Oliva 70:d20d30f59b1c 228 /*!
Silvio Lucio Oliva 70:d20d30f59b1c 229 @brief Updates the value of a characteristic, based on the service
Silvio Lucio Oliva 70:d20d30f59b1c 230 and characteristic index fields
Silvio Lucio Oliva 70:d20d30f59b1c 231
Silvio Lucio Oliva 70:d20d30f59b1c 232 @param[in] charHandle
Silvio Lucio Oliva 70:d20d30f59b1c 233 The handle of the GattCharacteristic to write to
Silvio Lucio Oliva 70:d20d30f59b1c 234 @param[in] buffer
Silvio Lucio Oliva 70:d20d30f59b1c 235 Data to use when updating the characteristic's value
Silvio Lucio Oliva 70:d20d30f59b1c 236 (raw byte array in LSB format)
Silvio Lucio Oliva 70:d20d30f59b1c 237 @param[in] len
Silvio Lucio Oliva 70:d20d30f59b1c 238 The number of bytes in buffer
Silvio Lucio Oliva 70:d20d30f59b1c 239
Silvio Lucio Oliva 70:d20d30f59b1c 240 @returns ble_error_t
Silvio Lucio Oliva 70:d20d30f59b1c 241
Silvio Lucio Oliva 70:d20d30f59b1c 242 @retval BLE_ERROR_NONE
Silvio Lucio Oliva 70:d20d30f59b1c 243 Everything executed properly
Silvio Lucio Oliva 70:d20d30f59b1c 244
Silvio Lucio Oliva 70:d20d30f59b1c 245 @section EXAMPLE
Silvio Lucio Oliva 70:d20d30f59b1c 246
Silvio Lucio Oliva 70:d20d30f59b1c 247 @code
Silvio Lucio Oliva 70:d20d30f59b1c 248
Silvio Lucio Oliva 70:d20d30f59b1c 249 @endcode
Silvio Lucio Oliva 70:d20d30f59b1c 250 */
Silvio Lucio Oliva 70:d20d30f59b1c 251 /**************************************************************************/
Silvio Lucio Oliva 70:d20d30f59b1c 252 // <<<ANDREA>>>
Silvio Lucio Oliva 70:d20d30f59b1c 253 ble_error_t BlueNRGGattServer::readValue(Gap::Handle_t connectionHandle, GattAttribute::Handle_t attributeHandle, uint8_t buffer[], uint16_t *lengthP) {
Silvio Lucio Oliva 70:d20d30f59b1c 254 // Empty by now
Silvio Lucio Oliva 70:d20d30f59b1c 255 return BLE_ERROR_NONE;
Silvio Lucio Oliva 70:d20d30f59b1c 256 }
Silvio Lucio Oliva 70:d20d30f59b1c 257
Silvio Lucio Oliva 70:d20d30f59b1c 258 ble_error_t BlueNRGGattServer::updateValue(Gap::Handle_t connectionHandle, GattAttribute::Handle_t, const uint8_t[], uint16_t, bool localOnly) {
Silvio Lucio Oliva 70:d20d30f59b1c 259 // Empty by now
Silvio Lucio Oliva 70:d20d30f59b1c 260 return BLE_ERROR_NONE;
Silvio Lucio Oliva 70:d20d30f59b1c 261 }
Silvio Lucio Oliva 70:d20d30f59b1c 262
Silvio Lucio Oliva 70:d20d30f59b1c 263 ble_error_t BlueNRGGattServer::updateValue(GattAttribute::Handle_t charHandle, const uint8_t buffer[], uint16_t len, bool localOnly)
Silvio Lucio Oliva 70:d20d30f59b1c 264 {
Silvio Lucio Oliva 70:d20d30f59b1c 265 tBleStatus ret;
Silvio Lucio Oliva 70:d20d30f59b1c 266 uint8_t buff[2];
Silvio Lucio Oliva 70:d20d30f59b1c 267
Silvio Lucio Oliva 70:d20d30f59b1c 268 DEBUG("updating bleCharacteristic charHandle =%u, corresponding serviceHanle= %u len=%d\n\r", charHandle, bleCharHanldeMap.find(charHandle)->second, len);
Silvio Lucio Oliva 70:d20d30f59b1c 269 /*
Silvio Lucio Oliva 70:d20d30f59b1c 270 for(int i=0; i<6; i++) {
Silvio Lucio Oliva 70:d20d30f59b1c 271 DEBUG("buffer[%d]=%d\n\r", i, buffer[i]);
Silvio Lucio Oliva 70:d20d30f59b1c 272 }
Silvio Lucio Oliva 70:d20d30f59b1c 273 */
Silvio Lucio Oliva 70:d20d30f59b1c 274 ret = aci_gatt_update_char_value(bleCharHanldeMap.find(charHandle)->second, charHandle, 0, len, buffer);
Silvio Lucio Oliva 70:d20d30f59b1c 275
Silvio Lucio Oliva 70:d20d30f59b1c 276 if (ret != BLE_STATUS_SUCCESS){
Silvio Lucio Oliva 70:d20d30f59b1c 277 DEBUG("Error while updating characteristic.\n\r") ;
Silvio Lucio Oliva 70:d20d30f59b1c 278 return BLE_ERROR_PARAM_OUT_OF_RANGE ; //Not correct Error Value
Silvio Lucio Oliva 70:d20d30f59b1c 279 //FIXME: Define Error values equivalent to BlueNRG Error Codes.
Silvio Lucio Oliva 70:d20d30f59b1c 280 }
Silvio Lucio Oliva 70:d20d30f59b1c 281
Silvio Lucio Oliva 70:d20d30f59b1c 282 //Generate Data Sent Event Here? (GattServerEvents::GATT_EVENT_DATA_SENT) //FIXME: Is this correct?
Silvio Lucio Oliva 70:d20d30f59b1c 283 //Check if characteristic property is NOTIFY|INDICATE, if yes generate event
Silvio Lucio Oliva 70:d20d30f59b1c 284 GattCharacteristic *p_char = BlueNRGGattServer::getInstance().getCharacteristicFromHandle(charHandle);
Silvio Lucio Oliva 70:d20d30f59b1c 285 if(p_char->getProperties() & (GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_NOTIFY
Silvio Lucio Oliva 70:d20d30f59b1c 286 | GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_INDICATE)) {
Silvio Lucio Oliva 70:d20d30f59b1c 287 BlueNRGGattServer::getInstance().handleEvent(GattServerEvents::GATT_EVENT_DATA_SENT, charHandle);
Silvio Lucio Oliva 70:d20d30f59b1c 288 }
Silvio Lucio Oliva 70:d20d30f59b1c 289
Silvio Lucio Oliva 70:d20d30f59b1c 290 return BLE_ERROR_NONE;
Silvio Lucio Oliva 70:d20d30f59b1c 291 }
Silvio Lucio Oliva 70:d20d30f59b1c 292
Silvio Lucio Oliva 70:d20d30f59b1c 293 /**************************************************************************/
Silvio Lucio Oliva 70:d20d30f59b1c 294 /*!
Silvio Lucio Oliva 70:d20d30f59b1c 295 @brief Reads a value according to the handle provided
Silvio Lucio Oliva 70:d20d30f59b1c 296
Silvio Lucio Oliva 70:d20d30f59b1c 297 @param[in] charHandle
Silvio Lucio Oliva 70:d20d30f59b1c 298 The handle of the GattCharacteristic to read from
Silvio Lucio Oliva 70:d20d30f59b1c 299
Silvio Lucio Oliva 70:d20d30f59b1c 300 @returns ble_error_t
Silvio Lucio Oliva 70:d20d30f59b1c 301
Silvio Lucio Oliva 70:d20d30f59b1c 302 @retval BLE_ERROR_NONE
Silvio Lucio Oliva 70:d20d30f59b1c 303 Everything executed properly
Silvio Lucio Oliva 70:d20d30f59b1c 304
Silvio Lucio Oliva 70:d20d30f59b1c 305 @section EXAMPLE
Silvio Lucio Oliva 70:d20d30f59b1c 306
Silvio Lucio Oliva 70:d20d30f59b1c 307 @code
Silvio Lucio Oliva 70:d20d30f59b1c 308
Silvio Lucio Oliva 70:d20d30f59b1c 309 @endcode
Silvio Lucio Oliva 70:d20d30f59b1c 310 */
Silvio Lucio Oliva 70:d20d30f59b1c 311 /**************************************************************************/
Silvio Lucio Oliva 70:d20d30f59b1c 312 ble_error_t BlueNRGGattServer::Read_Request_CB(uint16_t handle)
Silvio Lucio Oliva 70:d20d30f59b1c 313 {
Silvio Lucio Oliva 70:d20d30f59b1c 314 //signed short refvalue;
Silvio Lucio Oliva 70:d20d30f59b1c 315 uint16_t gapConnectionHandle = BlueNRGGap::getInstance().getConnectionHandle();
Silvio Lucio Oliva 70:d20d30f59b1c 316
Silvio Lucio Oliva 70:d20d30f59b1c 317 GattCharacteristicReadCBParams readParams;
Silvio Lucio Oliva 70:d20d30f59b1c 318 readParams.charHandle = handle;
Silvio Lucio Oliva 70:d20d30f59b1c 319
Silvio Lucio Oliva 70:d20d30f59b1c 320 //DEBUG("readParams.charHandle = %d\n\r", readParams.charHandle);
Silvio Lucio Oliva 70:d20d30f59b1c 321 HCIDataReadEvent(&readParams);
Silvio Lucio Oliva 70:d20d30f59b1c 322
Silvio Lucio Oliva 70:d20d30f59b1c 323 //EXIT:
Silvio Lucio Oliva 70:d20d30f59b1c 324 if(gapConnectionHandle != 0){
Silvio Lucio Oliva 70:d20d30f59b1c 325 //DEBUG("Calling aci_gatt_allow_read\n\r");
Silvio Lucio Oliva 70:d20d30f59b1c 326 aci_gatt_allow_read(gapConnectionHandle);
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 /*!
Silvio Lucio Oliva 70:d20d30f59b1c 332 @brief Returns the GattCharacteristic according to the handle provided
Silvio Lucio Oliva 70:d20d30f59b1c 333
Silvio Lucio Oliva 70:d20d30f59b1c 334 @param[in] charHandle
Silvio Lucio Oliva 70:d20d30f59b1c 335 The handle of the GattCharacteristic
Silvio Lucio Oliva 70:d20d30f59b1c 336
Silvio Lucio Oliva 70:d20d30f59b1c 337 @returns ble_error_t
Silvio Lucio Oliva 70:d20d30f59b1c 338
Silvio Lucio Oliva 70:d20d30f59b1c 339 @retval BLE_ERROR_NONE
Silvio Lucio Oliva 70:d20d30f59b1c 340 Everything executed properly
Silvio Lucio Oliva 70:d20d30f59b1c 341
Silvio Lucio Oliva 70:d20d30f59b1c 342 @section EXAMPLE
Silvio Lucio Oliva 70:d20d30f59b1c 343
Silvio Lucio Oliva 70:d20d30f59b1c 344 @code
Silvio Lucio Oliva 70:d20d30f59b1c 345
Silvio Lucio Oliva 70:d20d30f59b1c 346 @endcode
Silvio Lucio Oliva 70:d20d30f59b1c 347 */
Silvio Lucio Oliva 70:d20d30f59b1c 348 /**************************************************************************/
Silvio Lucio Oliva 70:d20d30f59b1c 349 GattCharacteristic* BlueNRGGattServer::getCharacteristicFromHandle(uint16_t attrHandle)
Silvio Lucio Oliva 70:d20d30f59b1c 350 {
Silvio Lucio Oliva 70:d20d30f59b1c 351 GattCharacteristic *p_char = NULL;
Silvio Lucio Oliva 70:d20d30f59b1c 352 int i;
Silvio Lucio Oliva 70:d20d30f59b1c 353 uint16_t handle;
Silvio Lucio Oliva 70:d20d30f59b1c 354
Silvio Lucio Oliva 70:d20d30f59b1c 355 //DEBUG("BlueNRGGattServer::getCharacteristicFromHandle()>>Attribute Handle received 0x%x\n\r",attrHandle);
Silvio Lucio Oliva 70:d20d30f59b1c 356 for(i=0; i<characteristicCount; i++)
Silvio Lucio Oliva 70:d20d30f59b1c 357 {
Silvio Lucio Oliva 70:d20d30f59b1c 358 handle = p_characteristics[i]->getValueAttribute().getHandle();
Silvio Lucio Oliva 70:d20d30f59b1c 359
Silvio Lucio Oliva 70:d20d30f59b1c 360 if(i==characteristicCount-1)//Last Characteristic check
Silvio Lucio Oliva 70:d20d30f59b1c 361 {
Silvio Lucio Oliva 70:d20d30f59b1c 362 if(attrHandle>=bleCharacteristicHandles[handle])
Silvio Lucio Oliva 70:d20d30f59b1c 363 {
Silvio Lucio Oliva 70:d20d30f59b1c 364 p_char = p_characteristics[i];
Silvio Lucio Oliva 70:d20d30f59b1c 365 DEBUG("Found Characteristic Properties 0x%x\n\r",p_char->getProperties());
Silvio Lucio Oliva 70:d20d30f59b1c 366 break;
Silvio Lucio Oliva 70:d20d30f59b1c 367 }
Silvio Lucio Oliva 70:d20d30f59b1c 368 }
Silvio Lucio Oliva 70:d20d30f59b1c 369 else {
Silvio Lucio Oliva 70:d20d30f59b1c 370 //Testing if attribute handle is between two Characteristic Handles
Silvio Lucio Oliva 70:d20d30f59b1c 371 if(attrHandle>=bleCharacteristicHandles[handle] && attrHandle<bleCharacteristicHandles[handle+1])
Silvio Lucio Oliva 70:d20d30f59b1c 372 {
Silvio Lucio Oliva 70:d20d30f59b1c 373 p_char = p_characteristics[i];
Silvio Lucio Oliva 70:d20d30f59b1c 374 //DEBUG("Found Characteristic Properties 0x%x\n\r",p_char->getProperties());
Silvio Lucio Oliva 70:d20d30f59b1c 375 break;
Silvio Lucio Oliva 70:d20d30f59b1c 376 } else continue;
Silvio Lucio Oliva 70:d20d30f59b1c 377 }
Silvio Lucio Oliva 70:d20d30f59b1c 378 }
Silvio Lucio Oliva 70:d20d30f59b1c 379
Silvio Lucio Oliva 70:d20d30f59b1c 380 return p_char;
Silvio Lucio Oliva 70:d20d30f59b1c 381 }
Silvio Lucio Oliva 70:d20d30f59b1c 382
Silvio Lucio Oliva 70:d20d30f59b1c 383 void BlueNRGGattServer::HCIDataWrittenEvent(const GattCharacteristicWriteCBParams *params) {
Silvio Lucio Oliva 70:d20d30f59b1c 384 this->handleDataWrittenEvent(params);
Silvio Lucio Oliva 70:d20d30f59b1c 385 }
Silvio Lucio Oliva 70:d20d30f59b1c 386
Silvio Lucio Oliva 70:d20d30f59b1c 387 void BlueNRGGattServer::HCIDataReadEvent(const GattCharacteristicReadCBParams *params) {
Silvio Lucio Oliva 70:d20d30f59b1c 388 //DEBUG("Called HCIDataReadEvent\n\r");
Silvio Lucio Oliva 70:d20d30f59b1c 389 this->handleDataReadEvent(params);
Silvio Lucio Oliva 70:d20d30f59b1c 390 }
Silvio Lucio Oliva 70:d20d30f59b1c 391
Silvio Lucio Oliva 70:d20d30f59b1c 392 void BlueNRGGattServer::HCIEvent(GattServerEvents::gattEvent_e type, uint16_t charHandle) {
Silvio Lucio Oliva 70:d20d30f59b1c 393 this->handleEvent(type, charHandle);
Silvio Lucio Oliva 70:d20d30f59b1c 394 }
Silvio Lucio Oliva 70:d20d30f59b1c 395
Silvio Lucio Oliva 70:d20d30f59b1c 396 void BlueNRGGattServer::HCIDataSentEvent(unsigned count) {
Silvio Lucio Oliva 70:d20d30f59b1c 397 this->handleDataSentEvent(count);
Silvio Lucio Oliva 70:d20d30f59b1c 398 }
Silvio Lucio Oliva 70:d20d30f59b1c 399
Silvio Lucio Oliva 70:d20d30f59b1c 400
Silvio Lucio Oliva 70:d20d30f59b1c 401 ble_error_t BlueNRGGattServer::initializeGATTDatabase(void) {
Silvio Lucio Oliva 70:d20d30f59b1c 402 // <TODO>
Silvio Lucio Oliva 70:d20d30f59b1c 403 return (ble_error_t)0;
Silvio Lucio Oliva 70:d20d30f59b1c 404 }