Previous version which works for my stm32f401 Nucleo board

Fork of X_NUCLEO_IDB0XA1 by ST

Committer:
hemddabral
Date:
Wed Oct 01 05:39:59 2014 +0000
Revision:
54:bae48224c2f9
Parent:
53:8c10d592ca49
Child:
55:0e4db6804c8d
Added support for BLE_API version 115.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mridup 2:a2b623661316 1 /* mbed Microcontroller Library
mridup 2:a2b623661316 2 * Copyright (c) 2006-2013 ARM Limited
mridup 2:a2b623661316 3 *
mridup 2:a2b623661316 4 * Licensed under the Apache License, Version 2.0 (the "License");
mridup 2:a2b623661316 5 * you may not use this file except in compliance with the License.
mridup 2:a2b623661316 6 * You may obtain a copy of the License at
mridup 2:a2b623661316 7 *
mridup 2:a2b623661316 8 * http://www.apache.org/licenses/LICENSE-2.0
mridup 2:a2b623661316 9 *
mridup 2:a2b623661316 10 * Unless required by applicable law or agreed to in writing, software
mridup 2:a2b623661316 11 * distributed under the License is distributed on an "AS IS" BASIS,
mridup 2:a2b623661316 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
mridup 2:a2b623661316 13 * See the License for the specific language governing permissions and
mridup 2:a2b623661316 14 * limitations under the License.
mridup 2:a2b623661316 15 */
mridup 2:a2b623661316 16
mridup 2:a2b623661316 17 #include "BlueNRGGattServer.h"
mridup 2:a2b623661316 18 #include "mbed.h"
mridup 2:a2b623661316 19 #include "BlueNRGGap.h"
mridup 17:63059fcb8db2 20 #include "Utils.h"
mridup 9:dbc2cfe5c24f 21
mridup 2:a2b623661316 22 /**************************************************************************/
mridup 2:a2b623661316 23 /*!
mridup 2:a2b623661316 24 @brief Adds a new service to the GATT table on the peripheral
mridup 2:a2b623661316 25
mridup 2:a2b623661316 26 @returns ble_error_t
mridup 2:a2b623661316 27
mridup 2:a2b623661316 28 @retval BLE_ERROR_NONE
mridup 2:a2b623661316 29 Everything executed properly
mridup 2:a2b623661316 30
mridup 2:a2b623661316 31 @section EXAMPLE
mridup 2:a2b623661316 32
mridup 2:a2b623661316 33 @code
mridup 2:a2b623661316 34
mridup 2:a2b623661316 35 @endcode
mridup 2:a2b623661316 36 */
mridup 2:a2b623661316 37 /**************************************************************************/
mridup 2:a2b623661316 38 ble_error_t BlueNRGGattServer::addService(GattService &service)
mridup 2:a2b623661316 39 {
mridup 2:a2b623661316 40 /* ToDo: Make sure we don't overflow the array, etc. */
mridup 2:a2b623661316 41 /* ToDo: Make sure this service UUID doesn't already exist (?) */
mridup 2:a2b623661316 42 /* ToDo: Basic validation */
mridup 5:31dedfa19a12 43
mridup 5:31dedfa19a12 44 tBleStatus ret;
mridup 50:898acb5227fc 45 uint8_t type;
mridup 50:898acb5227fc 46 uint16_t short_uuid;
mridup 50:898acb5227fc 47 uint8_t primary_short_uuid[2];
mridup 50:898acb5227fc 48 uint8_t primary_base_uuid[16];
mridup 50:898acb5227fc 49 uint8_t char_base_uuid[16];
mridup 50:898acb5227fc 50 const uint8_t *base_uuid;
mridup 50:898acb5227fc 51 const uint8_t *base_char_uuid;
mridup 50:898acb5227fc 52
mridup 50:898acb5227fc 53 type = (service.getUUID()).shortOrLong();
mridup 50:898acb5227fc 54 DEBUG("AddService(): Type:%d\n\r", type);
mridup 5:31dedfa19a12 55
mridup 5:31dedfa19a12 56 /* Add the service to the BlueNRG */
mridup 50:898acb5227fc 57 short_uuid = (service.getUUID()).getShortUUID();
mridup 50:898acb5227fc 58 STORE_LE_16(primary_short_uuid, short_uuid);
mridup 9:dbc2cfe5c24f 59
mridup 50:898acb5227fc 60 if(type==UUID::UUID_TYPE_LONG) {
hemddabral 52:94638d2461c1 61 base_uuid = (service.getUUID()).getBaseUUID();
hemddabral 52:94638d2461c1 62
hemddabral 52:94638d2461c1 63 //TODO:128 bit support for UUID
hemddabral 52:94638d2461c1 64 COPY_UUID_128(primary_base_uuid, base_uuid[15],base_uuid[14],base_uuid[13],base_uuid[12],base_uuid[11],base_uuid[10],base_uuid[9],
hemddabral 52:94638d2461c1 65 base_uuid[8],base_uuid[7],base_uuid[6],base_uuid[5],base_uuid[4],primary_short_uuid[1],primary_short_uuid[0],base_uuid[1],base_uuid[0]);
mridup 50:898acb5227fc 66 }
mridup 7:55ac052585db 67
mridup 7:55ac052585db 68 //TODO: Check UUID existence??
mridup 50:898acb5227fc 69 if(type==UUID::UUID_TYPE_SHORT) {
mridup 50:898acb5227fc 70 ret = aci_gatt_add_serv(UUID_TYPE_16, primary_short_uuid, PRIMARY_SERVICE, 7,
hemddabral 51:963982e7c17c 71 &servHandle);
mridup 50:898acb5227fc 72 }
mridup 50:898acb5227fc 73 else if(type==UUID::UUID_TYPE_LONG) {
mridup 50:898acb5227fc 74 ret = aci_gatt_add_serv(UUID_TYPE_128, primary_base_uuid, PRIMARY_SERVICE, 7,
hemddabral 51:963982e7c17c 75 &servHandle);
mridup 50:898acb5227fc 76 }
hemddabral 52:94638d2461c1 77
hemddabral 51:963982e7c17c 78 service.setHandle(servHandle);
hemddabral 52:94638d2461c1 79 //serviceHandleVector.push_back(servHandle);
hemddabral 52:94638d2461c1 80 DEBUG("added servHandle handle =%u\n\r", servHandle);
hemddabral 52:94638d2461c1 81 tHalUint16 bleCharacteristic;
mridup 2:a2b623661316 82
mridup 7:55ac052585db 83 //TODO: iterate to include all characteristics
mridup 7:55ac052585db 84 for (uint8_t i = 0; i < service.getCharacteristicCount(); i++) {
hemddabral 51:963982e7c17c 85 GattCharacteristic *p_char = service.getCharacteristic(i);
hemddabral 54:bae48224c2f9 86 uint16_t char_uuid = (p_char->getValueAttribute().getUUID()).getShortUUID();
hemddabral 51:963982e7c17c 87
hemddabral 51:963982e7c17c 88 uint8_t int_8_uuid[2];
hemddabral 51:963982e7c17c 89 STORE_LE_16(int_8_uuid, char_uuid);
hemddabral 51:963982e7c17c 90
hemddabral 51:963982e7c17c 91 if(type==UUID::UUID_TYPE_LONG) {
hemddabral 54:bae48224c2f9 92 base_char_uuid = (p_char->getValueAttribute().getUUID()).getBaseUUID();
hemddabral 52:94638d2461c1 93
hemddabral 52:94638d2461c1 94 COPY_UUID_128(char_base_uuid, base_char_uuid[15],base_char_uuid[14],base_char_uuid[13],base_char_uuid[12],base_char_uuid[11],base_char_uuid[10],base_char_uuid[9],
hemddabral 52:94638d2461c1 95 base_char_uuid[8],base_char_uuid[7],base_char_uuid[6],base_char_uuid[5],base_char_uuid[4],int_8_uuid[1],int_8_uuid[0],base_char_uuid[1],base_char_uuid[0]);
mridup 21:daebaf11a520 96 }
hemddabral 52:94638d2461c1 97 //TODO: Check UUID existence??
hemddabral 52:94638d2461c1 98 DEBUG("Char Properties 0x%x\n\r", p_char->getProperties());
hemddabral 52:94638d2461c1 99 /*
hemddabral 52:94638d2461c1 100 * Gatt_Evt_Mask -> HardCoded (0)
hemddabral 52:94638d2461c1 101 * Encryption_Key_Size -> Hardcoded (16)
hemddabral 52:94638d2461c1 102 * isVariable (variable length value field) -> Hardcoded (1)
hemddabral 52:94638d2461c1 103 */
hemddabral 52:94638d2461c1 104 tGattServerEvent Gatt_Evt_Mask = 0x0;
mridup 50:898acb5227fc 105
hemddabral 52:94638d2461c1 106 if((p_char->getProperties() &
hemddabral 52:94638d2461c1 107 (GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_WRITE_WITHOUT_RESPONSE|
hemddabral 52:94638d2461c1 108 GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_WRITE))) {
hemddabral 52:94638d2461c1 109 DEBUG("Setting up Gatt GATT_SERVER_ATTR_WRITE Mask\n\r");
hemddabral 52:94638d2461c1 110 Gatt_Evt_Mask = Gatt_Evt_Mask | GATT_SERVER_ATTR_WRITE;
hemddabral 52:94638d2461c1 111 }
hemddabral 52:94638d2461c1 112 if((p_char->getProperties() &
hemddabral 52:94638d2461c1 113 (GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_READ|
hemddabral 52:94638d2461c1 114 GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_NOTIFY| GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_INDICATE))) {
hemddabral 52:94638d2461c1 115 DEBUG("Setting up Gatt GATT_INTIMATE_APPL_WHEN_READ_N_WAIT Mask\n\r");
hemddabral 52:94638d2461c1 116 Gatt_Evt_Mask = Gatt_Evt_Mask | GATT_INTIMATE_APPL_WHEN_READ_N_WAIT;
hemddabral 52:94638d2461c1 117 } //This will support also GATT_SERVER_ATTR_READ_WRITE since it will be covered by previous if() check.
hemddabral 52:94638d2461c1 118
hemddabral 52:94638d2461c1 119 if(type==UUID::UUID_TYPE_SHORT) {
hemddabral 54:bae48224c2f9 120 ret = aci_gatt_add_char(service.getHandle(), UUID_TYPE_16, int_8_uuid, p_char->getValueAttribute().getMaxLength() /*2*/ /*Value Length*/,
hemddabral 52:94638d2461c1 121 p_char->getProperties(), ATTR_PERMISSION_NONE, Gatt_Evt_Mask /*Gatt_Evt_Mask*/,
hemddabral 52:94638d2461c1 122 16 /*Encryption_Key_Size*/, 1 /*isVariable*/, &bleCharacteristic);
hemddabral 52:94638d2461c1 123 }
hemddabral 52:94638d2461c1 124 else if(type==UUID::UUID_TYPE_LONG) {
hemddabral 54:bae48224c2f9 125 ret = aci_gatt_add_char(service.getHandle(), UUID_TYPE_128, char_base_uuid, p_char->getValueAttribute().getMaxLength() /*2*/ /*Value Length*/,
hemddabral 52:94638d2461c1 126 p_char->getProperties(), ATTR_PERMISSION_NONE, Gatt_Evt_Mask /*Gatt_Evt_Mask*/,
hemddabral 52:94638d2461c1 127 16 /*Encryption_Key_Size*/, 1 /*isVariable*/, &bleCharacteristic);
hemddabral 52:94638d2461c1 128 }
hemddabral 52:94638d2461c1 129 /* Update the characteristic handle */
hemddabral 52:94638d2461c1 130 uint16_t charHandle = characteristicCount;
hemddabral 52:94638d2461c1 131
hemddabral 52:94638d2461c1 132 bleCharHanldeMap.insert(std::pair<tHalUint16, tHalUint16>(bleCharacteristic, servHandle));
hemddabral 52:94638d2461c1 133
hemddabral 52:94638d2461c1 134 p_characteristics[characteristicCount++] = p_char;
hemddabral 54:bae48224c2f9 135 p_char->getValueAttribute().setHandle(bleCharacteristic); //Set the characteristic count as the corresponding char handle
hemddabral 52:94638d2461c1 136 DEBUG("added bleCharacteristic handle =%u\n\r", bleCharacteristic);
hemddabral 52:94638d2461c1 137
hemddabral 54:bae48224c2f9 138 if ((p_char->getValueAttribute().getValuePtr() != NULL) && (p_char->getValueAttribute().getInitialLength() > 0)) {
hemddabral 52:94638d2461c1 139 //updateValue(charHandle, p_char->getValuePtr(), p_char->getInitialLength(), false /* localOnly */);
hemddabral 54:bae48224c2f9 140 updateValue(p_char->getValueAttribute().getHandle(), p_char->getValueAttribute().getValuePtr(), p_char->getValueAttribute().getInitialLength(), false /* localOnly */);
mridup 7:55ac052585db 141 }
hemddabral 53:8c10d592ca49 142
hemddabral 53:8c10d592ca49 143 // add descriptors now
hemddabral 53:8c10d592ca49 144 uint16_t descHandle = 0;
hemddabral 53:8c10d592ca49 145 for(uint8_t descIndex=0; descIndex<p_char->getDescriptorCount(); descIndex++) {
hemddabral 53:8c10d592ca49 146 GattAttribute *descriptor = p_char->getDescriptor(descIndex);
hemddabral 53:8c10d592ca49 147 uint16_t shortUUID = descriptor->getUUID().getShortUUID();
hemddabral 53:8c10d592ca49 148 const tHalUint8 uuidArray[] = {(shortUUID>>8)&0xFF, (shortUUID&0xFF)};
hemddabral 54:bae48224c2f9 149 ret = aci_gatt_add_char_desc(service.getHandle(), p_char->getValueAttribute().getHandle(),
hemddabral 53:8c10d592ca49 150 CHAR_DESC_TYPE_16_BIT, uuidArray, descriptor->getMaxLength(), descriptor->getInitialLength(),
hemddabral 53:8c10d592ca49 151 descriptor->getValuePtr(), CHAR_DESC_SECURITY_PERMISSION, CHAR_DESC_ACCESS_PERMISSION, GATT_SERVER_ATTR_READ_WRITE,
hemddabral 53:8c10d592ca49 152 MIN_ENCRY_KEY_SIZE, CHAR_ATTRIBUTE_LEN_IS_FIXED, &descHandle);
hemddabral 53:8c10d592ca49 153 if(ret==(tBleStatus)0) {
hemddabral 53:8c10d592ca49 154 DEBUG("Descriptor added successfully, descriptor handle=%d\n\r", descHandle);
hemddabral 53:8c10d592ca49 155 descriptor->setHandle(descHandle);
hemddabral 53:8c10d592ca49 156 }
hemddabral 53:8c10d592ca49 157 }
mridup 7:55ac052585db 158 }
mridup 7:55ac052585db 159
mridup 5:31dedfa19a12 160 serviceCount++;
mridup 7:55ac052585db 161
mridup 7:55ac052585db 162 //FIXME: There is no GattService pointer array in GattServer.
mridup 7:55ac052585db 163 // There should be one? (Only the user is aware of GattServices!) Report to forum.
mridup 5:31dedfa19a12 164
mridup 2:a2b623661316 165 return BLE_ERROR_NONE;
mridup 2:a2b623661316 166 }
mridup 2:a2b623661316 167
mridup 2:a2b623661316 168 /**************************************************************************/
mridup 2:a2b623661316 169 /*!
mridup 2:a2b623661316 170 @brief Reads the value of a characteristic, based on the service
mridup 2:a2b623661316 171 and characteristic index fields
mridup 2:a2b623661316 172
mridup 2:a2b623661316 173 @param[in] charHandle
mridup 2:a2b623661316 174 The handle of the GattCharacteristic to read from
mridup 2:a2b623661316 175 @param[in] buffer
mridup 2:a2b623661316 176 Buffer to hold the the characteristic's value
mridup 2:a2b623661316 177 (raw byte array in LSB format)
mridup 2:a2b623661316 178 @param[in] len
mridup 2:a2b623661316 179 The number of bytes read into the buffer
mridup 2:a2b623661316 180
mridup 2:a2b623661316 181 @returns ble_error_t
mridup 2:a2b623661316 182
mridup 2:a2b623661316 183 @retval BLE_ERROR_NONE
mridup 2:a2b623661316 184 Everything executed properly
mridup 2:a2b623661316 185
mridup 2:a2b623661316 186 @section EXAMPLE
mridup 2:a2b623661316 187
mridup 2:a2b623661316 188 @code
mridup 2:a2b623661316 189
mridup 2:a2b623661316 190 @endcode
mridup 2:a2b623661316 191 */
mridup 2:a2b623661316 192 /**************************************************************************/
mridup 2:a2b623661316 193 ble_error_t BlueNRGGattServer::readValue(uint16_t charHandle, uint8_t buffer[], uint16_t *const lengthP)
mridup 2:a2b623661316 194 {
mridup 27:b4c21a9e8b39 195 DEBUG("ReadValue() Not Supported\n\r");
mridup 2:a2b623661316 196 return BLE_ERROR_NONE;
mridup 2:a2b623661316 197 }
mridup 2:a2b623661316 198
mridup 2:a2b623661316 199 /**************************************************************************/
mridup 2:a2b623661316 200 /*!
mridup 2:a2b623661316 201 @brief Updates the value of a characteristic, based on the service
mridup 2:a2b623661316 202 and characteristic index fields
mridup 2:a2b623661316 203
mridup 2:a2b623661316 204 @param[in] charHandle
mridup 2:a2b623661316 205 The handle of the GattCharacteristic to write to
mridup 2:a2b623661316 206 @param[in] buffer
mridup 2:a2b623661316 207 Data to use when updating the characteristic's value
mridup 2:a2b623661316 208 (raw byte array in LSB format)
mridup 2:a2b623661316 209 @param[in] len
mridup 2:a2b623661316 210 The number of bytes in buffer
mridup 2:a2b623661316 211
mridup 2:a2b623661316 212 @returns ble_error_t
mridup 2:a2b623661316 213
mridup 2:a2b623661316 214 @retval BLE_ERROR_NONE
mridup 2:a2b623661316 215 Everything executed properly
mridup 2:a2b623661316 216
mridup 2:a2b623661316 217 @section EXAMPLE
mridup 2:a2b623661316 218
mridup 2:a2b623661316 219 @code
mridup 2:a2b623661316 220
mridup 2:a2b623661316 221 @endcode
mridup 2:a2b623661316 222 */
mridup 2:a2b623661316 223 /**************************************************************************/
mridup 2:a2b623661316 224 ble_error_t BlueNRGGattServer::updateValue(uint16_t charHandle, uint8_t buffer[], uint16_t len, bool localOnly)
mridup 2:a2b623661316 225 {
mridup 17:63059fcb8db2 226 tBleStatus ret;
mridup 17:63059fcb8db2 227 tHalUint8 buff[2];
mridup 17:63059fcb8db2 228
hemddabral 52:94638d2461c1 229 DEBUG("updating bleCharacteristic charHandle =%u, corresponding serviceHanle= %u\n\r", charHandle, bleCharHanldeMap.find(charHandle)->second);
hemddabral 52:94638d2461c1 230 // <hdd>ret = aci_gatt_update_char_value(servHandle, bleCharacteristicHandles[charHandle], 0, len, buffer);
hemddabral 52:94638d2461c1 231 ret = aci_gatt_update_char_value(bleCharHanldeMap.find(charHandle)->second, charHandle, 0, len, buffer);
mridup 2:a2b623661316 232
mridup 17:63059fcb8db2 233 if (ret != BLE_STATUS_SUCCESS){
mridup 20:718d56821672 234 DEBUG("Error while updating characteristic.\n\r") ;
mridup 17:63059fcb8db2 235 return BLE_ERROR_PARAM_OUT_OF_RANGE ; //Not correct Error Value
mridup 17:63059fcb8db2 236 //FIXME: Define Error values equivalent to BlueNRG Error Codes.
mridup 17:63059fcb8db2 237 }
mridup 30:555e6697b368 238
mridup 30:555e6697b368 239 //Generate Data Sent Event Here? (GattServerEvents::GATT_EVENT_DATA_SENT) //FIXME: Is this correct?
mridup 30:555e6697b368 240 //Check if characteristic property is NOTIFY|INDICATE, if yes generate event
hemddabral 52:94638d2461c1 241 GattCharacteristic *p_char = BlueNRGGattServer::getInstance().getCharacteristicFromHandle(charHandle);
mridup 30:555e6697b368 242 if(p_char->getProperties() & (GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_NOTIFY
mridup 30:555e6697b368 243 | GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_INDICATE)) {
mridup 30:555e6697b368 244 BlueNRGGattServer::getInstance().handleEvent(GattServerEvents::GATT_EVENT_DATA_SENT);
mridup 30:555e6697b368 245 }
mridup 30:555e6697b368 246
mridup 17:63059fcb8db2 247 return BLE_ERROR_NONE;
mridup 2:a2b623661316 248 }
mridup 23:72e56ddfad5b 249
mridup 26:047d45ea379e 250 /**************************************************************************/
mridup 26:047d45ea379e 251 /*!
mridup 26:047d45ea379e 252 @brief Reads a value according to the handle provided
mridup 26:047d45ea379e 253
mridup 26:047d45ea379e 254 @param[in] charHandle
mridup 27:b4c21a9e8b39 255 The handle of the GattCharacteristic to read from
mridup 26:047d45ea379e 256
mridup 26:047d45ea379e 257 @returns ble_error_t
mridup 26:047d45ea379e 258
mridup 26:047d45ea379e 259 @retval BLE_ERROR_NONE
mridup 26:047d45ea379e 260 Everything executed properly
mridup 26:047d45ea379e 261
mridup 26:047d45ea379e 262 @section EXAMPLE
mridup 26:047d45ea379e 263
mridup 26:047d45ea379e 264 @code
mridup 26:047d45ea379e 265
mridup 26:047d45ea379e 266 @endcode
mridup 26:047d45ea379e 267 */
mridup 26:047d45ea379e 268 /**************************************************************************/
mridup 26:047d45ea379e 269 ble_error_t BlueNRGGattServer::Read_Request_CB(tHalUint16 handle)
mridup 26:047d45ea379e 270 {
mridup 26:047d45ea379e 271 //signed short refvalue;
mridup 26:047d45ea379e 272 uint16_t gapConnectionHandle = BlueNRGGap::getInstance().getConnectionHandle();
mridup 26:047d45ea379e 273
mridup 26:047d45ea379e 274 tBleStatus ret;
mridup 26:047d45ea379e 275 uint16_t data;
mridup 26:047d45ea379e 276 tHalUint8 buff[2];
mridup 26:047d45ea379e 277
mridup 26:047d45ea379e 278 data = 450 + ((uint64_t)rand()*100)/RAND_MAX;
mridup 26:047d45ea379e 279 STORE_LE_16(buff,data);
mridup 26:047d45ea379e 280
hemddabral 51:963982e7c17c 281 //ret = aci_gatt_update_char_value(servHandle, handle, 0, sizeof(buff), buff);
mridup 27:b4c21a9e8b39 282 //ret = aci_gatt_read_charac_val(gapConnectionHandle, handle);
mridup 26:047d45ea379e 283
mridup 26:047d45ea379e 284 //EXIT:
mridup 26:047d45ea379e 285 if(gapConnectionHandle != 0)
mridup 26:047d45ea379e 286 aci_gatt_allow_read(gapConnectionHandle);
mridup 26:047d45ea379e 287 }
mridup 26:047d45ea379e 288
mridup 27:b4c21a9e8b39 289 /**************************************************************************/
mridup 27:b4c21a9e8b39 290 /*!
mridup 27:b4c21a9e8b39 291 @brief Returns the GattCharacteristic according to the handle provided
mridup 27:b4c21a9e8b39 292
mridup 27:b4c21a9e8b39 293 @param[in] charHandle
mridup 27:b4c21a9e8b39 294 The handle of the GattCharacteristic
mridup 27:b4c21a9e8b39 295
mridup 27:b4c21a9e8b39 296 @returns ble_error_t
mridup 27:b4c21a9e8b39 297
mridup 27:b4c21a9e8b39 298 @retval BLE_ERROR_NONE
mridup 27:b4c21a9e8b39 299 Everything executed properly
mridup 27:b4c21a9e8b39 300
mridup 27:b4c21a9e8b39 301 @section EXAMPLE
mridup 27:b4c21a9e8b39 302
mridup 27:b4c21a9e8b39 303 @code
mridup 27:b4c21a9e8b39 304
mridup 27:b4c21a9e8b39 305 @endcode
mridup 27:b4c21a9e8b39 306 */
mridup 27:b4c21a9e8b39 307 /**************************************************************************/
mridup 28:edeb91b415c6 308 GattCharacteristic* BlueNRGGattServer::getCharacteristicFromHandle(tHalUint16 attrHandle)
mridup 27:b4c21a9e8b39 309 {
hemddabral 52:94638d2461c1 310 GattCharacteristic *p_char = NULL;
mridup 27:b4c21a9e8b39 311 int i;
mridup 30:555e6697b368 312 uint16_t handle;
hemddabral 52:94638d2461c1 313 #if 1
mridup 30:555e6697b368 314 //DEBUG("BlueNRGGattServer::getCharacteristicFromHandle()>>Attribute Handle received 0x%x\n\r",attrHandle);
mridup 27:b4c21a9e8b39 315 for(i=0; i<characteristicCount; i++)
mridup 27:b4c21a9e8b39 316 {
hemddabral 54:bae48224c2f9 317 handle = p_characteristics[i]->getValueAttribute().getHandle();
mridup 29:1870b03aa25b 318
mridup 29:1870b03aa25b 319 if(i==characteristicCount-1)//Last Characteristic check
mridup 27:b4c21a9e8b39 320 {
mridup 29:1870b03aa25b 321 if(attrHandle>=bleCharacteristicHandles[handle])
mridup 29:1870b03aa25b 322 {
mridup 29:1870b03aa25b 323 p_char = p_characteristics[i];
hemddabral 52:94638d2461c1 324 DEBUG("Found Characteristic Properties 0x%x\n\r",p_char->getProperties());
mridup 29:1870b03aa25b 325 break;
mridup 29:1870b03aa25b 326 }
mridup 29:1870b03aa25b 327 }
mridup 29:1870b03aa25b 328 else {
mridup 29:1870b03aa25b 329 //Testing if attribute handle is between two Characteristic Handles
mridup 30:555e6697b368 330 if(attrHandle>=bleCharacteristicHandles[handle] && attrHandle<bleCharacteristicHandles[handle+1])
mridup 29:1870b03aa25b 331 {
mridup 29:1870b03aa25b 332 p_char = p_characteristics[i];
mridup 29:1870b03aa25b 333 //DEBUG("Found Characteristic Properties 0x%x\n\r",p_char->getProperties());
mridup 29:1870b03aa25b 334 break;
mridup 29:1870b03aa25b 335 } else continue;
mridup 27:b4c21a9e8b39 336 }
mridup 27:b4c21a9e8b39 337 }
hemddabral 52:94638d2461c1 338 #endif
mridup 27:b4c21a9e8b39 339 return p_char;
mridup 27:b4c21a9e8b39 340 }
hemddabral 37:07487777d9c6 341
hemddabral 37:07487777d9c6 342 /**************************************************************************/
hemddabral 37:07487777d9c6 343 /*!
hemddabral 37:07487777d9c6 344 @brief sets device name characteristic
hemddabral 37:07487777d9c6 345
hemddabral 37:07487777d9c6 346 @param[in] deviceName
hemddabral 37:07487777d9c6 347 pointer to device name to be set
hemddabral 37:07487777d9c6 348
hemddabral 37:07487777d9c6 349 @returns ble_error_t
hemddabral 37:07487777d9c6 350
hemddabral 37:07487777d9c6 351 @retval BLE_ERROR_NONE
hemddabral 37:07487777d9c6 352 Everything executed properly
hemddabral 37:07487777d9c6 353
hemddabral 37:07487777d9c6 354 @section EXAMPLE
hemddabral 37:07487777d9c6 355
hemddabral 37:07487777d9c6 356 @code
hemddabral 37:07487777d9c6 357
hemddabral 37:07487777d9c6 358 @endcode
hemddabral 37:07487777d9c6 359 */
hemddabral 37:07487777d9c6 360 /**************************************************************************/
hemddabral 37:07487777d9c6 361 ble_error_t BlueNRGGattServer::setDeviceName(const uint8_t *deviceName)
hemddabral 37:07487777d9c6 362 {
mridup 45:1fff7d7d5ce7 363 int ret;
mridup 45:1fff7d7d5ce7 364 uint8_t nameLen = 0;
mridup 45:1fff7d7d5ce7 365
mridup 45:1fff7d7d5ce7 366 DeviceName = (uint8_t *)deviceName;
mridup 45:1fff7d7d5ce7 367 //DEBUG("SetDeviceName=%s\n\r", DeviceName);
mridup 45:1fff7d7d5ce7 368
mridup 45:1fff7d7d5ce7 369 nameLen = strlen((const char*)DeviceName);
mridup 45:1fff7d7d5ce7 370 //DEBUG("DeviceName Size=%d\n\r", nameLen);
mridup 45:1fff7d7d5ce7 371
mridup 45:1fff7d7d5ce7 372 ret = aci_gatt_update_char_value(g_gap_service_handle,
mridup 45:1fff7d7d5ce7 373 g_device_name_char_handle,
mridup 45:1fff7d7d5ce7 374 0,
mridup 45:1fff7d7d5ce7 375 nameLen,
mridup 45:1fff7d7d5ce7 376 (tHalUint8 *)DeviceName);
mridup 45:1fff7d7d5ce7 377
mridup 45:1fff7d7d5ce7 378 if(ret){
mridup 45:1fff7d7d5ce7 379 DEBUG("device set name failed\n\r");
mridup 45:1fff7d7d5ce7 380 return BLE_ERROR_PARAM_OUT_OF_RANGE;//TODO:Wrong error code
mridup 45:1fff7d7d5ce7 381 }
mridup 45:1fff7d7d5ce7 382
hemddabral 37:07487777d9c6 383 return BLE_ERROR_NONE;
hemddabral 37:07487777d9c6 384 }
hemddabral 37:07487777d9c6 385
hemddabral 37:07487777d9c6 386 /**************************************************************************/
hemddabral 37:07487777d9c6 387 /*!
hemddabral 37:07487777d9c6 388 @brief gets device name characteristic
hemddabral 37:07487777d9c6 389
hemddabral 37:07487777d9c6 390 @param[in] deviceName
hemddabral 37:07487777d9c6 391 pointer to device name
hemddabral 37:07487777d9c6 392
hemddabral 37:07487777d9c6 393
hemddabral 37:07487777d9c6 394 @param[in] lengthP
hemddabral 37:07487777d9c6 395 pointer to device name length
hemddabral 37:07487777d9c6 396
hemddabral 37:07487777d9c6 397 @returns ble_error_t
hemddabral 37:07487777d9c6 398
hemddabral 37:07487777d9c6 399 @retval BLE_ERROR_NONE
hemddabral 37:07487777d9c6 400 Everything executed properly
hemddabral 37:07487777d9c6 401
hemddabral 37:07487777d9c6 402 @section EXAMPLE
hemddabral 37:07487777d9c6 403
hemddabral 37:07487777d9c6 404 @code
hemddabral 37:07487777d9c6 405
hemddabral 37:07487777d9c6 406 @endcode
hemddabral 37:07487777d9c6 407 */
hemddabral 37:07487777d9c6 408 /**************************************************************************/
hemddabral 37:07487777d9c6 409 ble_error_t BlueNRGGattServer::getDeviceName(uint8_t *deviceName, unsigned *lengthP)
mridup 45:1fff7d7d5ce7 410 {
mridup 45:1fff7d7d5ce7 411 int ret;
mridup 45:1fff7d7d5ce7 412
mridup 45:1fff7d7d5ce7 413 if(DeviceName==NULL)
mridup 45:1fff7d7d5ce7 414 return BLE_ERROR_PARAM_OUT_OF_RANGE;
mridup 45:1fff7d7d5ce7 415
mridup 45:1fff7d7d5ce7 416 strcpy((char*)deviceName, (const char*)DeviceName);
mridup 45:1fff7d7d5ce7 417 //DEBUG("GetDeviceName=%s\n\r", deviceName);
mridup 45:1fff7d7d5ce7 418
mridup 45:1fff7d7d5ce7 419 *lengthP = strlen((const char*)DeviceName);
mridup 45:1fff7d7d5ce7 420 //DEBUG("DeviceName Size=%d\n\r", *lengthP);
mridup 45:1fff7d7d5ce7 421
hemddabral 37:07487777d9c6 422 return BLE_ERROR_NONE;
hemddabral 37:07487777d9c6 423 }
hemddabral 37:07487777d9c6 424
hemddabral 37:07487777d9c6 425 /**************************************************************************/
hemddabral 37:07487777d9c6 426 /*!
hemddabral 37:07487777d9c6 427 @brief sets device appearance characteristic
hemddabral 37:07487777d9c6 428
hemddabral 37:07487777d9c6 429 @param[in] appearance
hemddabral 37:07487777d9c6 430 device appearance
hemddabral 37:07487777d9c6 431
hemddabral 37:07487777d9c6 432 @returns ble_error_t
hemddabral 37:07487777d9c6 433
hemddabral 37:07487777d9c6 434 @retval BLE_ERROR_NONE
hemddabral 37:07487777d9c6 435 Everything executed properly
hemddabral 37:07487777d9c6 436
hemddabral 37:07487777d9c6 437 @section EXAMPLE
hemddabral 37:07487777d9c6 438
hemddabral 37:07487777d9c6 439 @code
hemddabral 37:07487777d9c6 440
hemddabral 37:07487777d9c6 441 @endcode
hemddabral 37:07487777d9c6 442 */
hemddabral 37:07487777d9c6 443 /**************************************************************************/
hemddabral 37:07487777d9c6 444 ble_error_t BlueNRGGattServer::setAppearance(uint16_t appearance)
hemddabral 37:07487777d9c6 445 {
mridup 46:01f97cfcc109 446 /*
mridup 46:01f97cfcc109 447 Tested with GapAdvertisingData::GENERIC_PHONE.
mridup 46:01f97cfcc109 448 for other appearances BLE Scanner android app is not behaving properly
mridup 46:01f97cfcc109 449 */
mridup 46:01f97cfcc109 450 //char deviceAppearance[2];
mridup 46:01f97cfcc109 451 STORE_LE_16(deviceAppearance, appearance);
mridup 46:01f97cfcc109 452 DEBUG("input: incoming = %d deviceAppearance= 0x%x 0x%x\n\r", appearance, deviceAppearance[1], deviceAppearance[0]);
mridup 46:01f97cfcc109 453
mridup 46:01f97cfcc109 454 aci_gatt_update_char_value(g_gap_service_handle, g_appearance_char_handle, 0, 2, (tHalUint8 *)deviceAppearance);
mridup 46:01f97cfcc109 455
hemddabral 37:07487777d9c6 456 return BLE_ERROR_NONE;
hemddabral 37:07487777d9c6 457 }
hemddabral 37:07487777d9c6 458
hemddabral 37:07487777d9c6 459 /**************************************************************************/
hemddabral 37:07487777d9c6 460 /*!
hemddabral 37:07487777d9c6 461 @brief gets device appearance
hemddabral 37:07487777d9c6 462
hemddabral 37:07487777d9c6 463 @param[in] appearance
hemddabral 37:07487777d9c6 464 pointer to device appearance value
hemddabral 37:07487777d9c6 465
hemddabral 37:07487777d9c6 466 @returns ble_error_t
hemddabral 37:07487777d9c6 467
hemddabral 37:07487777d9c6 468 @retval BLE_ERROR_NONE
hemddabral 37:07487777d9c6 469 Everything executed properly
hemddabral 37:07487777d9c6 470
hemddabral 37:07487777d9c6 471 @section EXAMPLE
hemddabral 37:07487777d9c6 472
hemddabral 37:07487777d9c6 473 @code
hemddabral 37:07487777d9c6 474
hemddabral 37:07487777d9c6 475 @endcode
hemddabral 37:07487777d9c6 476 */
hemddabral 37:07487777d9c6 477 /**************************************************************************/
hemddabral 37:07487777d9c6 478 ble_error_t BlueNRGGattServer::getAppearance(uint16_t *appearanceP)
hemddabral 37:07487777d9c6 479 {
mridup 47:45b79f89b739 480 uint16_t devP;
mridup 47:45b79f89b739 481 if(!appearanceP) return BLE_ERROR_PARAM_OUT_OF_RANGE;
mridup 47:45b79f89b739 482 devP = ((uint16_t)(0x0000|deviceAppearance[0])) | (((uint16_t)(0x0000|deviceAppearance[1]))<<8);
mridup 47:45b79f89b739 483 strcpy((char*)appearanceP, (const char*)&devP);
mridup 47:45b79f89b739 484
hemddabral 37:07487777d9c6 485 return BLE_ERROR_NONE;
hemddabral 37:07487777d9c6 486 }
hemddabral 37:07487777d9c6 487