Previous version which works for my stm32f401 Nucleo board

Fork of X_NUCLEO_IDB0XA1 by ST

Committer:
mridup
Date:
Mon Sep 15 13:19:08 2014 +0000
Revision:
50:898acb5227fc
Parent:
47:45b79f89b739
Child:
51:963982e7c17c
Initial 128-bit support in Service and Characteristic addition

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) {
mridup 50:898acb5227fc 61 base_uuid = (service.getUUID()).getBaseUUID();
mridup 50:898acb5227fc 62
mridup 50:898acb5227fc 63 //TODO:128 bit support for UUID
mridup 50:898acb5227fc 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],
mridup 50:898acb5227fc 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,
mridup 5:31dedfa19a12 71 &hrmServHandle);
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,
mridup 50:898acb5227fc 75 &hrmServHandle);
mridup 50:898acb5227fc 76 }
mridup 5:31dedfa19a12 77 service.setHandle(hrmServHandle);
mridup 2:a2b623661316 78
mridup 7:55ac052585db 79 //TODO: iterate to include all characteristics
mridup 7:55ac052585db 80 for (uint8_t i = 0; i < service.getCharacteristicCount(); i++) {
mridup 20:718d56821672 81 GattCharacteristic *p_char = service.getCharacteristic(i);
mridup 50:898acb5227fc 82 uint16_t char_uuid = (p_char->getUUID()).getShortUUID();
mridup 7:55ac052585db 83
mridup 13:4c30346287e4 84 uint8_t int_8_uuid[2];
mridup 13:4c30346287e4 85 STORE_LE_16(int_8_uuid, char_uuid);
mridup 50:898acb5227fc 86
mridup 50:898acb5227fc 87 if(type==UUID::UUID_TYPE_LONG) {
mridup 50:898acb5227fc 88 base_char_uuid = (p_char->getUUID()).getBaseUUID();
mridup 50:898acb5227fc 89
mridup 50:898acb5227fc 90 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],
mridup 50:898acb5227fc 91 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 50:898acb5227fc 92 }
mridup 7:55ac052585db 93 //TODO: Check UUID existence??
mridup 20:718d56821672 94 DEBUG("Char Properties 0x%x\n\r", p_char->getProperties());
mridup 20:718d56821672 95 /*
mridup 20:718d56821672 96 * Gatt_Evt_Mask -> HardCoded (0)
mridup 20:718d56821672 97 * Encryption_Key_Size -> Hardcoded (16)
mridup 20:718d56821672 98 * isVariable (variable length value field) -> Hardcoded (1)
mridup 20:718d56821672 99 */
mridup 21:daebaf11a520 100 tGattServerEvent Gatt_Evt_Mask = 0x0;
mridup 21:daebaf11a520 101
mridup 21:daebaf11a520 102 if((p_char->getProperties() &
mridup 21:daebaf11a520 103 (GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_WRITE_WITHOUT_RESPONSE|
mridup 21:daebaf11a520 104 GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_WRITE))) {
mridup 23:72e56ddfad5b 105 DEBUG("Setting up Gatt GATT_SERVER_ATTR_WRITE Mask\n\r");
mridup 22:36fd20c0fb9c 106 Gatt_Evt_Mask = Gatt_Evt_Mask | GATT_SERVER_ATTR_WRITE;
mridup 21:daebaf11a520 107 }
mridup 22:36fd20c0fb9c 108 if((p_char->getProperties() &
mridup 22:36fd20c0fb9c 109 (GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_READ|
mridup 31:46dff2d2dd4f 110 GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_NOTIFY| GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_INDICATE))) {
mridup 23:72e56ddfad5b 111 DEBUG("Setting up Gatt GATT_INTIMATE_APPL_WHEN_READ_N_WAIT Mask\n\r");
mridup 23:72e56ddfad5b 112 Gatt_Evt_Mask = Gatt_Evt_Mask | GATT_INTIMATE_APPL_WHEN_READ_N_WAIT;
mridup 23:72e56ddfad5b 113 } //This will support also GATT_SERVER_ATTR_READ_WRITE since it will be covered by previous if() check.
mridup 50:898acb5227fc 114
mridup 50:898acb5227fc 115 if(type==UUID::UUID_TYPE_SHORT) {
mridup 50:898acb5227fc 116 ret = aci_gatt_add_char(service.getHandle(), UUID_TYPE_16, int_8_uuid, p_char->getMaxLength() /*2*/ /*Value Length*/,
mridup 21:daebaf11a520 117 p_char->getProperties(), ATTR_PERMISSION_NONE, Gatt_Evt_Mask /*Gatt_Evt_Mask*/,
mridup 20:718d56821672 118 16 /*Encryption_Key_Size*/, 1 /*isVariable*/, &bleCharacteristicHandles[characteristicCount]);
mridup 50:898acb5227fc 119 }
mridup 50:898acb5227fc 120 else if(type==UUID::UUID_TYPE_LONG) {
mridup 50:898acb5227fc 121 ret = aci_gatt_add_char(service.getHandle(), UUID_TYPE_128, char_base_uuid, p_char->getMaxLength() /*2*/ /*Value Length*/,
mridup 50:898acb5227fc 122 p_char->getProperties(), ATTR_PERMISSION_NONE, Gatt_Evt_Mask /*Gatt_Evt_Mask*/,
mridup 50:898acb5227fc 123 16 /*Encryption_Key_Size*/, 1 /*isVariable*/, &bleCharacteristicHandles[characteristicCount]);
mridup 50:898acb5227fc 124 }
mridup 7:55ac052585db 125 /* Update the characteristic handle */
mridup 7:55ac052585db 126 uint16_t charHandle = characteristicCount;
mridup 5:31dedfa19a12 127
mridup 5:31dedfa19a12 128 p_characteristics[characteristicCount++] = p_char;
mridup 7:55ac052585db 129 p_char->setHandle(charHandle); //Set the characteristic count as the corresponding char handle
mridup 7:55ac052585db 130
mridup 7:55ac052585db 131 if ((p_char->getValuePtr() != NULL) && (p_char->getInitialLength() > 0)) {
mridup 7:55ac052585db 132 updateValue(charHandle, p_char->getValuePtr(), p_char->getInitialLength(), false /* localOnly */);
mridup 7:55ac052585db 133 }
mridup 7:55ac052585db 134 }
mridup 7:55ac052585db 135
mridup 5:31dedfa19a12 136 serviceCount++;
mridup 7:55ac052585db 137
mridup 7:55ac052585db 138 //FIXME: There is no GattService pointer array in GattServer.
mridup 7:55ac052585db 139 // There should be one? (Only the user is aware of GattServices!) Report to forum.
mridup 5:31dedfa19a12 140
mridup 2:a2b623661316 141 return BLE_ERROR_NONE;
mridup 2:a2b623661316 142 }
mridup 2:a2b623661316 143
mridup 7:55ac052585db 144
mridup 2:a2b623661316 145 /**************************************************************************/
mridup 2:a2b623661316 146 /*!
mridup 2:a2b623661316 147 @brief Reads the value of a characteristic, based on the service
mridup 2:a2b623661316 148 and characteristic index fields
mridup 2:a2b623661316 149
mridup 2:a2b623661316 150 @param[in] charHandle
mridup 2:a2b623661316 151 The handle of the GattCharacteristic to read from
mridup 2:a2b623661316 152 @param[in] buffer
mridup 2:a2b623661316 153 Buffer to hold the the characteristic's value
mridup 2:a2b623661316 154 (raw byte array in LSB format)
mridup 2:a2b623661316 155 @param[in] len
mridup 2:a2b623661316 156 The number of bytes read into the buffer
mridup 2:a2b623661316 157
mridup 2:a2b623661316 158 @returns ble_error_t
mridup 2:a2b623661316 159
mridup 2:a2b623661316 160 @retval BLE_ERROR_NONE
mridup 2:a2b623661316 161 Everything executed properly
mridup 2:a2b623661316 162
mridup 2:a2b623661316 163 @section EXAMPLE
mridup 2:a2b623661316 164
mridup 2:a2b623661316 165 @code
mridup 2:a2b623661316 166
mridup 2:a2b623661316 167 @endcode
mridup 2:a2b623661316 168 */
mridup 2:a2b623661316 169 /**************************************************************************/
mridup 2:a2b623661316 170 ble_error_t BlueNRGGattServer::readValue(uint16_t charHandle, uint8_t buffer[], uint16_t *const lengthP)
mridup 2:a2b623661316 171 {
mridup 27:b4c21a9e8b39 172 DEBUG("ReadValue() Not Supported\n\r");
mridup 2:a2b623661316 173 return BLE_ERROR_NONE;
mridup 2:a2b623661316 174 }
mridup 2:a2b623661316 175
mridup 2:a2b623661316 176 /**************************************************************************/
mridup 2:a2b623661316 177 /*!
mridup 2:a2b623661316 178 @brief Updates the value of a characteristic, based on the service
mridup 2:a2b623661316 179 and characteristic index fields
mridup 2:a2b623661316 180
mridup 2:a2b623661316 181 @param[in] charHandle
mridup 2:a2b623661316 182 The handle of the GattCharacteristic to write to
mridup 2:a2b623661316 183 @param[in] buffer
mridup 2:a2b623661316 184 Data to use when updating the characteristic's value
mridup 2:a2b623661316 185 (raw byte array in LSB format)
mridup 2:a2b623661316 186 @param[in] len
mridup 2:a2b623661316 187 The number of bytes in buffer
mridup 2:a2b623661316 188
mridup 2:a2b623661316 189 @returns ble_error_t
mridup 2:a2b623661316 190
mridup 2:a2b623661316 191 @retval BLE_ERROR_NONE
mridup 2:a2b623661316 192 Everything executed properly
mridup 2:a2b623661316 193
mridup 2:a2b623661316 194 @section EXAMPLE
mridup 2:a2b623661316 195
mridup 2:a2b623661316 196 @code
mridup 2:a2b623661316 197
mridup 2:a2b623661316 198 @endcode
mridup 2:a2b623661316 199 */
mridup 2:a2b623661316 200 /**************************************************************************/
mridup 2:a2b623661316 201 ble_error_t BlueNRGGattServer::updateValue(uint16_t charHandle, uint8_t buffer[], uint16_t len, bool localOnly)
mridup 2:a2b623661316 202 {
mridup 17:63059fcb8db2 203 tBleStatus ret;
mridup 17:63059fcb8db2 204 tHalUint8 buff[2];
mridup 2:a2b623661316 205
mridup 20:718d56821672 206 //STORE_LE_16(buff,125);
mridup 17:63059fcb8db2 207
mridup 20:718d56821672 208 //DEBUG("CharHandle: %d\n\r", charHandle);
mridup 20:718d56821672 209 //DEBUG("Actual Handle: 0x%x\n\r", bleCharacteristicHandles[charHandle]);
mridup 20:718d56821672 210 //DEBUG("Service Handle: 0x%x\n\r", hrmServHandle);
mridup 20:718d56821672 211 //DEBUG("buffer[0]: %d\n\r", buffer[0]);
mridup 20:718d56821672 212 //DEBUG("buffer[1]: %d\n\r", buffer[1]);
mridup 20:718d56821672 213 //DEBUG("len: %d\n\r", len);
mridup 5:31dedfa19a12 214
mridup 17:63059fcb8db2 215 ret = aci_gatt_update_char_value(hrmServHandle, bleCharacteristicHandles[charHandle], 0, len, buffer);
mridup 2:a2b623661316 216
mridup 17:63059fcb8db2 217 if (ret != BLE_STATUS_SUCCESS){
mridup 20:718d56821672 218 DEBUG("Error while updating characteristic.\n\r") ;
mridup 17:63059fcb8db2 219 return BLE_ERROR_PARAM_OUT_OF_RANGE ; //Not correct Error Value
mridup 17:63059fcb8db2 220 //FIXME: Define Error values equivalent to BlueNRG Error Codes.
mridup 17:63059fcb8db2 221 }
mridup 30:555e6697b368 222
mridup 30:555e6697b368 223 //Generate Data Sent Event Here? (GattServerEvents::GATT_EVENT_DATA_SENT) //FIXME: Is this correct?
mridup 30:555e6697b368 224 //Check if characteristic property is NOTIFY|INDICATE, if yes generate event
mridup 30:555e6697b368 225 GattCharacteristic *p_char = BlueNRGGattServer::getInstance().getCharacteristicFromHandle(bleCharacteristicHandles[charHandle]);
mridup 30:555e6697b368 226 if(p_char->getProperties() & (GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_NOTIFY
mridup 30:555e6697b368 227 | GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_INDICATE)) {
mridup 30:555e6697b368 228 BlueNRGGattServer::getInstance().handleEvent(GattServerEvents::GATT_EVENT_DATA_SENT);
mridup 30:555e6697b368 229 }
mridup 30:555e6697b368 230
mridup 17:63059fcb8db2 231 return BLE_ERROR_NONE;
mridup 2:a2b623661316 232 }
mridup 23:72e56ddfad5b 233
mridup 26:047d45ea379e 234 /**************************************************************************/
mridup 26:047d45ea379e 235 /*!
mridup 26:047d45ea379e 236 @brief Reads a value according to the handle provided
mridup 26:047d45ea379e 237
mridup 26:047d45ea379e 238 @param[in] charHandle
mridup 27:b4c21a9e8b39 239 The handle of the GattCharacteristic to read from
mridup 26:047d45ea379e 240
mridup 26:047d45ea379e 241 @returns ble_error_t
mridup 26:047d45ea379e 242
mridup 26:047d45ea379e 243 @retval BLE_ERROR_NONE
mridup 26:047d45ea379e 244 Everything executed properly
mridup 26:047d45ea379e 245
mridup 26:047d45ea379e 246 @section EXAMPLE
mridup 26:047d45ea379e 247
mridup 26:047d45ea379e 248 @code
mridup 26:047d45ea379e 249
mridup 26:047d45ea379e 250 @endcode
mridup 26:047d45ea379e 251 */
mridup 26:047d45ea379e 252 /**************************************************************************/
mridup 26:047d45ea379e 253 ble_error_t BlueNRGGattServer::Read_Request_CB(tHalUint16 handle)
mridup 26:047d45ea379e 254 {
mridup 26:047d45ea379e 255 //signed short refvalue;
mridup 26:047d45ea379e 256 uint16_t gapConnectionHandle = BlueNRGGap::getInstance().getConnectionHandle();
mridup 26:047d45ea379e 257
mridup 26:047d45ea379e 258 tBleStatus ret;
mridup 26:047d45ea379e 259 uint16_t data;
mridup 26:047d45ea379e 260 tHalUint8 buff[2];
mridup 26:047d45ea379e 261
mridup 26:047d45ea379e 262 data = 450 + ((uint64_t)rand()*100)/RAND_MAX;
mridup 26:047d45ea379e 263 STORE_LE_16(buff,data);
mridup 26:047d45ea379e 264
mridup 27:b4c21a9e8b39 265 //ret = aci_gatt_update_char_value(hrmServHandle, handle, 0, sizeof(buff), buff);
mridup 27:b4c21a9e8b39 266 //ret = aci_gatt_read_charac_val(gapConnectionHandle, handle);
mridup 26:047d45ea379e 267
mridup 26:047d45ea379e 268 //EXIT:
mridup 26:047d45ea379e 269 if(gapConnectionHandle != 0)
mridup 26:047d45ea379e 270 aci_gatt_allow_read(gapConnectionHandle);
mridup 26:047d45ea379e 271 }
mridup 26:047d45ea379e 272
mridup 27:b4c21a9e8b39 273 /**************************************************************************/
mridup 27:b4c21a9e8b39 274 /*!
mridup 27:b4c21a9e8b39 275 @brief Returns the GattCharacteristic according to the handle provided
mridup 27:b4c21a9e8b39 276
mridup 27:b4c21a9e8b39 277 @param[in] charHandle
mridup 27:b4c21a9e8b39 278 The handle of the GattCharacteristic
mridup 27:b4c21a9e8b39 279
mridup 27:b4c21a9e8b39 280 @returns ble_error_t
mridup 27:b4c21a9e8b39 281
mridup 27:b4c21a9e8b39 282 @retval BLE_ERROR_NONE
mridup 27:b4c21a9e8b39 283 Everything executed properly
mridup 27:b4c21a9e8b39 284
mridup 27:b4c21a9e8b39 285 @section EXAMPLE
mridup 27:b4c21a9e8b39 286
mridup 27:b4c21a9e8b39 287 @code
mridup 27:b4c21a9e8b39 288
mridup 27:b4c21a9e8b39 289 @endcode
mridup 27:b4c21a9e8b39 290 */
mridup 27:b4c21a9e8b39 291 /**************************************************************************/
mridup 28:edeb91b415c6 292 GattCharacteristic* BlueNRGGattServer::getCharacteristicFromHandle(tHalUint16 attrHandle)
mridup 27:b4c21a9e8b39 293 {
mridup 27:b4c21a9e8b39 294 GattCharacteristic *p_char;
mridup 27:b4c21a9e8b39 295 int i;
mridup 30:555e6697b368 296 uint16_t handle;
mridup 29:1870b03aa25b 297
mridup 30:555e6697b368 298 //DEBUG("BlueNRGGattServer::getCharacteristicFromHandle()>>Attribute Handle received 0x%x\n\r",attrHandle);
mridup 27:b4c21a9e8b39 299 for(i=0; i<characteristicCount; i++)
mridup 27:b4c21a9e8b39 300 {
mridup 27:b4c21a9e8b39 301 handle = p_characteristics[i]->getHandle();
mridup 29:1870b03aa25b 302
mridup 29:1870b03aa25b 303 if(i==characteristicCount-1)//Last Characteristic check
mridup 27:b4c21a9e8b39 304 {
mridup 29:1870b03aa25b 305 if(attrHandle>=bleCharacteristicHandles[handle])
mridup 29:1870b03aa25b 306 {
mridup 29:1870b03aa25b 307 p_char = p_characteristics[i];
mridup 29:1870b03aa25b 308 //DEBUG("Found Characteristic Properties 0x%x\n\r",p_char->getProperties());
mridup 29:1870b03aa25b 309 break;
mridup 29:1870b03aa25b 310 }
mridup 29:1870b03aa25b 311 }
mridup 29:1870b03aa25b 312 else {
mridup 29:1870b03aa25b 313 //Testing if attribute handle is between two Characteristic Handles
mridup 30:555e6697b368 314 if(attrHandle>=bleCharacteristicHandles[handle] && attrHandle<bleCharacteristicHandles[handle+1])
mridup 29:1870b03aa25b 315 {
mridup 29:1870b03aa25b 316 p_char = p_characteristics[i];
mridup 29:1870b03aa25b 317 //DEBUG("Found Characteristic Properties 0x%x\n\r",p_char->getProperties());
mridup 29:1870b03aa25b 318 break;
mridup 29:1870b03aa25b 319 } else continue;
mridup 27:b4c21a9e8b39 320 }
mridup 27:b4c21a9e8b39 321 }
mridup 27:b4c21a9e8b39 322 return p_char;
mridup 27:b4c21a9e8b39 323 }
hemddabral 37:07487777d9c6 324
hemddabral 37:07487777d9c6 325 /**************************************************************************/
hemddabral 37:07487777d9c6 326 /*!
hemddabral 37:07487777d9c6 327 @brief sets device name characteristic
hemddabral 37:07487777d9c6 328
hemddabral 37:07487777d9c6 329 @param[in] deviceName
hemddabral 37:07487777d9c6 330 pointer to device name to be set
hemddabral 37:07487777d9c6 331
hemddabral 37:07487777d9c6 332 @returns ble_error_t
hemddabral 37:07487777d9c6 333
hemddabral 37:07487777d9c6 334 @retval BLE_ERROR_NONE
hemddabral 37:07487777d9c6 335 Everything executed properly
hemddabral 37:07487777d9c6 336
hemddabral 37:07487777d9c6 337 @section EXAMPLE
hemddabral 37:07487777d9c6 338
hemddabral 37:07487777d9c6 339 @code
hemddabral 37:07487777d9c6 340
hemddabral 37:07487777d9c6 341 @endcode
hemddabral 37:07487777d9c6 342 */
hemddabral 37:07487777d9c6 343 /**************************************************************************/
hemddabral 37:07487777d9c6 344 ble_error_t BlueNRGGattServer::setDeviceName(const uint8_t *deviceName)
hemddabral 37:07487777d9c6 345 {
mridup 45:1fff7d7d5ce7 346 int ret;
mridup 45:1fff7d7d5ce7 347 uint8_t nameLen = 0;
mridup 45:1fff7d7d5ce7 348
mridup 45:1fff7d7d5ce7 349 DeviceName = (uint8_t *)deviceName;
mridup 45:1fff7d7d5ce7 350 //DEBUG("SetDeviceName=%s\n\r", DeviceName);
mridup 45:1fff7d7d5ce7 351
mridup 45:1fff7d7d5ce7 352 nameLen = strlen((const char*)DeviceName);
mridup 45:1fff7d7d5ce7 353 //DEBUG("DeviceName Size=%d\n\r", nameLen);
mridup 45:1fff7d7d5ce7 354
mridup 45:1fff7d7d5ce7 355 ret = aci_gatt_update_char_value(g_gap_service_handle,
mridup 45:1fff7d7d5ce7 356 g_device_name_char_handle,
mridup 45:1fff7d7d5ce7 357 0,
mridup 45:1fff7d7d5ce7 358 nameLen,
mridup 45:1fff7d7d5ce7 359 (tHalUint8 *)DeviceName);
mridup 45:1fff7d7d5ce7 360
mridup 45:1fff7d7d5ce7 361 if(ret){
mridup 45:1fff7d7d5ce7 362 DEBUG("device set name failed\n\r");
mridup 45:1fff7d7d5ce7 363 return BLE_ERROR_PARAM_OUT_OF_RANGE;//TODO:Wrong error code
mridup 45:1fff7d7d5ce7 364 }
mridup 45:1fff7d7d5ce7 365
hemddabral 37:07487777d9c6 366 return BLE_ERROR_NONE;
hemddabral 37:07487777d9c6 367 }
hemddabral 37:07487777d9c6 368
hemddabral 37:07487777d9c6 369 /**************************************************************************/
hemddabral 37:07487777d9c6 370 /*!
hemddabral 37:07487777d9c6 371 @brief gets device name characteristic
hemddabral 37:07487777d9c6 372
hemddabral 37:07487777d9c6 373 @param[in] deviceName
hemddabral 37:07487777d9c6 374 pointer to device name
hemddabral 37:07487777d9c6 375
hemddabral 37:07487777d9c6 376
hemddabral 37:07487777d9c6 377 @param[in] lengthP
hemddabral 37:07487777d9c6 378 pointer to device name length
hemddabral 37:07487777d9c6 379
hemddabral 37:07487777d9c6 380 @returns ble_error_t
hemddabral 37:07487777d9c6 381
hemddabral 37:07487777d9c6 382 @retval BLE_ERROR_NONE
hemddabral 37:07487777d9c6 383 Everything executed properly
hemddabral 37:07487777d9c6 384
hemddabral 37:07487777d9c6 385 @section EXAMPLE
hemddabral 37:07487777d9c6 386
hemddabral 37:07487777d9c6 387 @code
hemddabral 37:07487777d9c6 388
hemddabral 37:07487777d9c6 389 @endcode
hemddabral 37:07487777d9c6 390 */
hemddabral 37:07487777d9c6 391 /**************************************************************************/
hemddabral 37:07487777d9c6 392 ble_error_t BlueNRGGattServer::getDeviceName(uint8_t *deviceName, unsigned *lengthP)
mridup 45:1fff7d7d5ce7 393 {
mridup 45:1fff7d7d5ce7 394 int ret;
mridup 45:1fff7d7d5ce7 395
mridup 45:1fff7d7d5ce7 396 if(DeviceName==NULL)
mridup 45:1fff7d7d5ce7 397 return BLE_ERROR_PARAM_OUT_OF_RANGE;
mridup 45:1fff7d7d5ce7 398
mridup 45:1fff7d7d5ce7 399 strcpy((char*)deviceName, (const char*)DeviceName);
mridup 45:1fff7d7d5ce7 400 //DEBUG("GetDeviceName=%s\n\r", deviceName);
mridup 45:1fff7d7d5ce7 401
mridup 45:1fff7d7d5ce7 402 *lengthP = strlen((const char*)DeviceName);
mridup 45:1fff7d7d5ce7 403 //DEBUG("DeviceName Size=%d\n\r", *lengthP);
mridup 45:1fff7d7d5ce7 404
hemddabral 37:07487777d9c6 405 return BLE_ERROR_NONE;
hemddabral 37:07487777d9c6 406 }
hemddabral 37:07487777d9c6 407
hemddabral 37:07487777d9c6 408 /**************************************************************************/
hemddabral 37:07487777d9c6 409 /*!
hemddabral 37:07487777d9c6 410 @brief sets device appearance characteristic
hemddabral 37:07487777d9c6 411
hemddabral 37:07487777d9c6 412 @param[in] appearance
hemddabral 37:07487777d9c6 413 device appearance
hemddabral 37:07487777d9c6 414
hemddabral 37:07487777d9c6 415 @returns ble_error_t
hemddabral 37:07487777d9c6 416
hemddabral 37:07487777d9c6 417 @retval BLE_ERROR_NONE
hemddabral 37:07487777d9c6 418 Everything executed properly
hemddabral 37:07487777d9c6 419
hemddabral 37:07487777d9c6 420 @section EXAMPLE
hemddabral 37:07487777d9c6 421
hemddabral 37:07487777d9c6 422 @code
hemddabral 37:07487777d9c6 423
hemddabral 37:07487777d9c6 424 @endcode
hemddabral 37:07487777d9c6 425 */
hemddabral 37:07487777d9c6 426 /**************************************************************************/
hemddabral 37:07487777d9c6 427 ble_error_t BlueNRGGattServer::setAppearance(uint16_t appearance)
hemddabral 37:07487777d9c6 428 {
mridup 46:01f97cfcc109 429 /*
mridup 46:01f97cfcc109 430 Tested with GapAdvertisingData::GENERIC_PHONE.
mridup 46:01f97cfcc109 431 for other appearances BLE Scanner android app is not behaving properly
mridup 46:01f97cfcc109 432 */
mridup 46:01f97cfcc109 433 //char deviceAppearance[2];
mridup 46:01f97cfcc109 434 STORE_LE_16(deviceAppearance, appearance);
mridup 46:01f97cfcc109 435 DEBUG("input: incoming = %d deviceAppearance= 0x%x 0x%x\n\r", appearance, deviceAppearance[1], deviceAppearance[0]);
mridup 46:01f97cfcc109 436
mridup 46:01f97cfcc109 437 aci_gatt_update_char_value(g_gap_service_handle, g_appearance_char_handle, 0, 2, (tHalUint8 *)deviceAppearance);
mridup 46:01f97cfcc109 438
hemddabral 37:07487777d9c6 439 return BLE_ERROR_NONE;
hemddabral 37:07487777d9c6 440 }
hemddabral 37:07487777d9c6 441
hemddabral 37:07487777d9c6 442 /**************************************************************************/
hemddabral 37:07487777d9c6 443 /*!
hemddabral 37:07487777d9c6 444 @brief gets device appearance
hemddabral 37:07487777d9c6 445
hemddabral 37:07487777d9c6 446 @param[in] appearance
hemddabral 37:07487777d9c6 447 pointer to device appearance value
hemddabral 37:07487777d9c6 448
hemddabral 37:07487777d9c6 449 @returns ble_error_t
hemddabral 37:07487777d9c6 450
hemddabral 37:07487777d9c6 451 @retval BLE_ERROR_NONE
hemddabral 37:07487777d9c6 452 Everything executed properly
hemddabral 37:07487777d9c6 453
hemddabral 37:07487777d9c6 454 @section EXAMPLE
hemddabral 37:07487777d9c6 455
hemddabral 37:07487777d9c6 456 @code
hemddabral 37:07487777d9c6 457
hemddabral 37:07487777d9c6 458 @endcode
hemddabral 37:07487777d9c6 459 */
hemddabral 37:07487777d9c6 460 /**************************************************************************/
hemddabral 37:07487777d9c6 461 ble_error_t BlueNRGGattServer::getAppearance(uint16_t *appearanceP)
hemddabral 37:07487777d9c6 462 {
mridup 47:45b79f89b739 463 uint16_t devP;
mridup 47:45b79f89b739 464 if(!appearanceP) return BLE_ERROR_PARAM_OUT_OF_RANGE;
mridup 47:45b79f89b739 465 devP = ((uint16_t)(0x0000|deviceAppearance[0])) | (((uint16_t)(0x0000|deviceAppearance[1]))<<8);
mridup 47:45b79f89b739 466 strcpy((char*)appearanceP, (const char*)&devP);
mridup 47:45b79f89b739 467
hemddabral 37:07487777d9c6 468 return BLE_ERROR_NONE;
hemddabral 37:07487777d9c6 469 }
hemddabral 37:07487777d9c6 470