Previous version which works for my stm32f401 Nucleo board

Fork of X_NUCLEO_IDB0XA1 by ST

Committer:
mridup
Date:
Fri Sep 05 09:20:09 2014 +0000
Revision:
47:45b79f89b739
Parent:
46:01f97cfcc109
Child:
50:898acb5227fc
BLEDevice getAppearance()

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