Previous version which works for my stm32f401 Nucleo board

Fork of X_NUCLEO_IDB0XA1 by ST

Committer:
mridup
Date:
Mon Aug 25 06:19:28 2014 +0000
Revision:
31:46dff2d2dd4f
Parent:
30:555e6697b368
Child:
37:07487777d9c6
update to BLE_API revision 104. Connection handle as parameter in conn/disconn callbacks.

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 2:a2b623661316 21
mridup 5:31dedfa19a12 22 #define STORE_LE_16(buf, val) ( ((buf)[0] = (tHalUint8) (val) ) , \
mridup 5:31dedfa19a12 23 ((buf)[1] = (tHalUint8) (val>>8) ) )
mridup 5:31dedfa19a12 24
mridup 5:31dedfa19a12 25 #define STORE_LE_32(buf, val) ( ((buf)[0] = (tHalUint8) (val) ) , \
mridup 5:31dedfa19a12 26 ((buf)[1] = (tHalUint8) (val>>8) ) , \
mridup 5:31dedfa19a12 27 ((buf)[2] = (tHalUint8) (val>>16) ) , \
mridup 5:31dedfa19a12 28 ((buf)[3] = (tHalUint8) (val>>24) ) )
mridup 9:dbc2cfe5c24f 29
mridup 2:a2b623661316 30 /**************************************************************************/
mridup 2:a2b623661316 31 /*!
mridup 2:a2b623661316 32 @brief Adds a new service to the GATT table on the peripheral
mridup 2:a2b623661316 33
mridup 2:a2b623661316 34 @returns ble_error_t
mridup 2:a2b623661316 35
mridup 2:a2b623661316 36 @retval BLE_ERROR_NONE
mridup 2:a2b623661316 37 Everything executed properly
mridup 2:a2b623661316 38
mridup 2:a2b623661316 39 @section EXAMPLE
mridup 2:a2b623661316 40
mridup 2:a2b623661316 41 @code
mridup 2:a2b623661316 42
mridup 2:a2b623661316 43 @endcode
mridup 2:a2b623661316 44 */
mridup 2:a2b623661316 45 /**************************************************************************/
mridup 2:a2b623661316 46 ble_error_t BlueNRGGattServer::addService(GattService &service)
mridup 2:a2b623661316 47 {
mridup 2:a2b623661316 48 /* ToDo: Make sure we don't overflow the array, etc. */
mridup 2:a2b623661316 49 /* ToDo: Make sure this service UUID doesn't already exist (?) */
mridup 2:a2b623661316 50 /* ToDo: Basic validation */
mridup 5:31dedfa19a12 51
mridup 5:31dedfa19a12 52 tBleStatus ret;
mridup 5:31dedfa19a12 53
mridup 20:718d56821672 54 DEBUG("AddService()\n\r");
mridup 5:31dedfa19a12 55 /* Add the service to the BlueNRG */
mridup 9:dbc2cfe5c24f 56 uint16_t short_uuid = (service.getUUID()).getShortUUID();
mridup 9:dbc2cfe5c24f 57
mridup 9:dbc2cfe5c24f 58 uint8_t primary_uuid[2];//= {0x0D,0x18};
mridup 9:dbc2cfe5c24f 59 STORE_LE_16(primary_uuid, short_uuid);
mridup 7:55ac052585db 60
mridup 7:55ac052585db 61 //TODO: Check UUID existence??
mridup 5:31dedfa19a12 62
mridup 8:486bcaa4eb3d 63 ret = aci_gatt_add_serv(UUID_TYPE_16, primary_uuid, PRIMARY_SERVICE, 7,
mridup 5:31dedfa19a12 64 &hrmServHandle);
mridup 5:31dedfa19a12 65 service.setHandle(hrmServHandle);
mridup 2:a2b623661316 66
mridup 7:55ac052585db 67 //TODO: iterate to include all characteristics
mridup 7:55ac052585db 68 for (uint8_t i = 0; i < service.getCharacteristicCount(); i++) {
mridup 20:718d56821672 69 GattCharacteristic *p_char = service.getCharacteristic(i);
mridup 5:31dedfa19a12 70 uint16_t char_uuid = (p_char->getUUID()).getShortUUID();
mridup 7:55ac052585db 71
mridup 13:4c30346287e4 72 uint8_t int_8_uuid[2];
mridup 13:4c30346287e4 73 STORE_LE_16(int_8_uuid, char_uuid);
mridup 7:55ac052585db 74 //TODO: Check UUID existence??
mridup 20:718d56821672 75 DEBUG("Char Properties 0x%x\n\r", p_char->getProperties());
mridup 20:718d56821672 76 /*
mridup 20:718d56821672 77 * Gatt_Evt_Mask -> HardCoded (0)
mridup 20:718d56821672 78 * Encryption_Key_Size -> Hardcoded (16)
mridup 20:718d56821672 79 * isVariable (variable length value field) -> Hardcoded (1)
mridup 20:718d56821672 80 */
mridup 21:daebaf11a520 81 tGattServerEvent Gatt_Evt_Mask = 0x0;
mridup 21:daebaf11a520 82
mridup 21:daebaf11a520 83 if((p_char->getProperties() &
mridup 21:daebaf11a520 84 (GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_WRITE_WITHOUT_RESPONSE|
mridup 21:daebaf11a520 85 GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_WRITE))) {
mridup 23:72e56ddfad5b 86 DEBUG("Setting up Gatt GATT_SERVER_ATTR_WRITE Mask\n\r");
mridup 22:36fd20c0fb9c 87 Gatt_Evt_Mask = Gatt_Evt_Mask | GATT_SERVER_ATTR_WRITE;
mridup 21:daebaf11a520 88 }
mridup 22:36fd20c0fb9c 89 if((p_char->getProperties() &
mridup 22:36fd20c0fb9c 90 (GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_READ|
mridup 31:46dff2d2dd4f 91 GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_NOTIFY| GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_INDICATE))) {
mridup 23:72e56ddfad5b 92 DEBUG("Setting up Gatt GATT_INTIMATE_APPL_WHEN_READ_N_WAIT Mask\n\r");
mridup 23:72e56ddfad5b 93 Gatt_Evt_Mask = Gatt_Evt_Mask | GATT_INTIMATE_APPL_WHEN_READ_N_WAIT;
mridup 23:72e56ddfad5b 94 } //This will support also GATT_SERVER_ATTR_READ_WRITE since it will be covered by previous if() check.
mridup 21:daebaf11a520 95
mridup 20:718d56821672 96 ret = aci_gatt_add_char(service.getHandle(), UUID_TYPE_16, int_8_uuid, p_char->getMaxLength() /*2*/ /*Value Length*/,
mridup 21:daebaf11a520 97 p_char->getProperties(), ATTR_PERMISSION_NONE, Gatt_Evt_Mask /*Gatt_Evt_Mask*/,
mridup 20:718d56821672 98 16 /*Encryption_Key_Size*/, 1 /*isVariable*/, &bleCharacteristicHandles[characteristicCount]);
mridup 7:55ac052585db 99
mridup 7:55ac052585db 100 /* Update the characteristic handle */
mridup 7:55ac052585db 101 uint16_t charHandle = characteristicCount;
mridup 5:31dedfa19a12 102
mridup 5:31dedfa19a12 103 p_characteristics[characteristicCount++] = p_char;
mridup 7:55ac052585db 104 p_char->setHandle(charHandle); //Set the characteristic count as the corresponding char handle
mridup 7:55ac052585db 105
mridup 7:55ac052585db 106 if ((p_char->getValuePtr() != NULL) && (p_char->getInitialLength() > 0)) {
mridup 7:55ac052585db 107 updateValue(charHandle, p_char->getValuePtr(), p_char->getInitialLength(), false /* localOnly */);
mridup 7:55ac052585db 108 }
mridup 7:55ac052585db 109 }
mridup 7:55ac052585db 110
mridup 5:31dedfa19a12 111 serviceCount++;
mridup 7:55ac052585db 112
mridup 7:55ac052585db 113 //FIXME: There is no GattService pointer array in GattServer.
mridup 7:55ac052585db 114 // There should be one? (Only the user is aware of GattServices!) Report to forum.
mridup 5:31dedfa19a12 115
mridup 2:a2b623661316 116 return BLE_ERROR_NONE;
mridup 2:a2b623661316 117 }
mridup 2:a2b623661316 118
mridup 7:55ac052585db 119
mridup 2:a2b623661316 120 /**************************************************************************/
mridup 2:a2b623661316 121 /*!
mridup 2:a2b623661316 122 @brief Reads the value of a characteristic, based on the service
mridup 2:a2b623661316 123 and characteristic index fields
mridup 2:a2b623661316 124
mridup 2:a2b623661316 125 @param[in] charHandle
mridup 2:a2b623661316 126 The handle of the GattCharacteristic to read from
mridup 2:a2b623661316 127 @param[in] buffer
mridup 2:a2b623661316 128 Buffer to hold the the characteristic's value
mridup 2:a2b623661316 129 (raw byte array in LSB format)
mridup 2:a2b623661316 130 @param[in] len
mridup 2:a2b623661316 131 The number of bytes read into the buffer
mridup 2:a2b623661316 132
mridup 2:a2b623661316 133 @returns ble_error_t
mridup 2:a2b623661316 134
mridup 2:a2b623661316 135 @retval BLE_ERROR_NONE
mridup 2:a2b623661316 136 Everything executed properly
mridup 2:a2b623661316 137
mridup 2:a2b623661316 138 @section EXAMPLE
mridup 2:a2b623661316 139
mridup 2:a2b623661316 140 @code
mridup 2:a2b623661316 141
mridup 2:a2b623661316 142 @endcode
mridup 2:a2b623661316 143 */
mridup 2:a2b623661316 144 /**************************************************************************/
mridup 2:a2b623661316 145 ble_error_t BlueNRGGattServer::readValue(uint16_t charHandle, uint8_t buffer[], uint16_t *const lengthP)
mridup 2:a2b623661316 146 {
mridup 27:b4c21a9e8b39 147 DEBUG("ReadValue() Not Supported\n\r");
mridup 2:a2b623661316 148 return BLE_ERROR_NONE;
mridup 2:a2b623661316 149 }
mridup 2:a2b623661316 150
mridup 2:a2b623661316 151 /**************************************************************************/
mridup 2:a2b623661316 152 /*!
mridup 2:a2b623661316 153 @brief Updates the value of a characteristic, based on the service
mridup 2:a2b623661316 154 and characteristic index fields
mridup 2:a2b623661316 155
mridup 2:a2b623661316 156 @param[in] charHandle
mridup 2:a2b623661316 157 The handle of the GattCharacteristic to write to
mridup 2:a2b623661316 158 @param[in] buffer
mridup 2:a2b623661316 159 Data to use when updating the characteristic's value
mridup 2:a2b623661316 160 (raw byte array in LSB format)
mridup 2:a2b623661316 161 @param[in] len
mridup 2:a2b623661316 162 The number of bytes in buffer
mridup 2:a2b623661316 163
mridup 2:a2b623661316 164 @returns ble_error_t
mridup 2:a2b623661316 165
mridup 2:a2b623661316 166 @retval BLE_ERROR_NONE
mridup 2:a2b623661316 167 Everything executed properly
mridup 2:a2b623661316 168
mridup 2:a2b623661316 169 @section EXAMPLE
mridup 2:a2b623661316 170
mridup 2:a2b623661316 171 @code
mridup 2:a2b623661316 172
mridup 2:a2b623661316 173 @endcode
mridup 2:a2b623661316 174 */
mridup 2:a2b623661316 175 /**************************************************************************/
mridup 2:a2b623661316 176 ble_error_t BlueNRGGattServer::updateValue(uint16_t charHandle, uint8_t buffer[], uint16_t len, bool localOnly)
mridup 2:a2b623661316 177 {
mridup 17:63059fcb8db2 178 tBleStatus ret;
mridup 17:63059fcb8db2 179 tHalUint8 buff[2];
mridup 2:a2b623661316 180
mridup 20:718d56821672 181 //STORE_LE_16(buff,125);
mridup 17:63059fcb8db2 182
mridup 20:718d56821672 183 //DEBUG("CharHandle: %d\n\r", charHandle);
mridup 20:718d56821672 184 //DEBUG("Actual Handle: 0x%x\n\r", bleCharacteristicHandles[charHandle]);
mridup 20:718d56821672 185 //DEBUG("Service Handle: 0x%x\n\r", hrmServHandle);
mridup 20:718d56821672 186 //DEBUG("buffer[0]: %d\n\r", buffer[0]);
mridup 20:718d56821672 187 //DEBUG("buffer[1]: %d\n\r", buffer[1]);
mridup 20:718d56821672 188 //DEBUG("len: %d\n\r", len);
mridup 5:31dedfa19a12 189
mridup 17:63059fcb8db2 190 ret = aci_gatt_update_char_value(hrmServHandle, bleCharacteristicHandles[charHandle], 0, len, buffer);
mridup 2:a2b623661316 191
mridup 17:63059fcb8db2 192 if (ret != BLE_STATUS_SUCCESS){
mridup 20:718d56821672 193 DEBUG("Error while updating characteristic.\n\r") ;
mridup 17:63059fcb8db2 194 return BLE_ERROR_PARAM_OUT_OF_RANGE ; //Not correct Error Value
mridup 17:63059fcb8db2 195 //FIXME: Define Error values equivalent to BlueNRG Error Codes.
mridup 17:63059fcb8db2 196 }
mridup 30:555e6697b368 197
mridup 30:555e6697b368 198 //Generate Data Sent Event Here? (GattServerEvents::GATT_EVENT_DATA_SENT) //FIXME: Is this correct?
mridup 30:555e6697b368 199 //Check if characteristic property is NOTIFY|INDICATE, if yes generate event
mridup 30:555e6697b368 200 GattCharacteristic *p_char = BlueNRGGattServer::getInstance().getCharacteristicFromHandle(bleCharacteristicHandles[charHandle]);
mridup 30:555e6697b368 201 if(p_char->getProperties() & (GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_NOTIFY
mridup 30:555e6697b368 202 | GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_INDICATE)) {
mridup 30:555e6697b368 203 BlueNRGGattServer::getInstance().handleEvent(GattServerEvents::GATT_EVENT_DATA_SENT);
mridup 30:555e6697b368 204 }
mridup 30:555e6697b368 205
mridup 17:63059fcb8db2 206 return BLE_ERROR_NONE;
mridup 2:a2b623661316 207 }
mridup 23:72e56ddfad5b 208
mridup 26:047d45ea379e 209 /**************************************************************************/
mridup 26:047d45ea379e 210 /*!
mridup 26:047d45ea379e 211 @brief Reads a value according to the handle provided
mridup 26:047d45ea379e 212
mridup 26:047d45ea379e 213 @param[in] charHandle
mridup 27:b4c21a9e8b39 214 The handle of the GattCharacteristic to read from
mridup 26:047d45ea379e 215
mridup 26:047d45ea379e 216 @returns ble_error_t
mridup 26:047d45ea379e 217
mridup 26:047d45ea379e 218 @retval BLE_ERROR_NONE
mridup 26:047d45ea379e 219 Everything executed properly
mridup 26:047d45ea379e 220
mridup 26:047d45ea379e 221 @section EXAMPLE
mridup 26:047d45ea379e 222
mridup 26:047d45ea379e 223 @code
mridup 26:047d45ea379e 224
mridup 26:047d45ea379e 225 @endcode
mridup 26:047d45ea379e 226 */
mridup 26:047d45ea379e 227 /**************************************************************************/
mridup 26:047d45ea379e 228 ble_error_t BlueNRGGattServer::Read_Request_CB(tHalUint16 handle)
mridup 26:047d45ea379e 229 {
mridup 26:047d45ea379e 230 //signed short refvalue;
mridup 26:047d45ea379e 231 uint16_t gapConnectionHandle = BlueNRGGap::getInstance().getConnectionHandle();
mridup 26:047d45ea379e 232
mridup 26:047d45ea379e 233 tBleStatus ret;
mridup 26:047d45ea379e 234 uint16_t data;
mridup 26:047d45ea379e 235 tHalUint8 buff[2];
mridup 26:047d45ea379e 236
mridup 26:047d45ea379e 237 data = 450 + ((uint64_t)rand()*100)/RAND_MAX;
mridup 26:047d45ea379e 238 STORE_LE_16(buff,data);
mridup 26:047d45ea379e 239
mridup 27:b4c21a9e8b39 240 //ret = aci_gatt_update_char_value(hrmServHandle, handle, 0, sizeof(buff), buff);
mridup 27:b4c21a9e8b39 241 //ret = aci_gatt_read_charac_val(gapConnectionHandle, handle);
mridup 26:047d45ea379e 242
mridup 26:047d45ea379e 243 //EXIT:
mridup 26:047d45ea379e 244 if(gapConnectionHandle != 0)
mridup 26:047d45ea379e 245 aci_gatt_allow_read(gapConnectionHandle);
mridup 26:047d45ea379e 246 }
mridup 26:047d45ea379e 247
mridup 27:b4c21a9e8b39 248 /**************************************************************************/
mridup 27:b4c21a9e8b39 249 /*!
mridup 27:b4c21a9e8b39 250 @brief Returns the GattCharacteristic according to the handle provided
mridup 27:b4c21a9e8b39 251
mridup 27:b4c21a9e8b39 252 @param[in] charHandle
mridup 27:b4c21a9e8b39 253 The handle of the GattCharacteristic
mridup 27:b4c21a9e8b39 254
mridup 27:b4c21a9e8b39 255 @returns ble_error_t
mridup 27:b4c21a9e8b39 256
mridup 27:b4c21a9e8b39 257 @retval BLE_ERROR_NONE
mridup 27:b4c21a9e8b39 258 Everything executed properly
mridup 27:b4c21a9e8b39 259
mridup 27:b4c21a9e8b39 260 @section EXAMPLE
mridup 27:b4c21a9e8b39 261
mridup 27:b4c21a9e8b39 262 @code
mridup 27:b4c21a9e8b39 263
mridup 27:b4c21a9e8b39 264 @endcode
mridup 27:b4c21a9e8b39 265 */
mridup 27:b4c21a9e8b39 266 /**************************************************************************/
mridup 28:edeb91b415c6 267 GattCharacteristic* BlueNRGGattServer::getCharacteristicFromHandle(tHalUint16 attrHandle)
mridup 27:b4c21a9e8b39 268 {
mridup 27:b4c21a9e8b39 269 GattCharacteristic *p_char;
mridup 27:b4c21a9e8b39 270 int i;
mridup 30:555e6697b368 271 uint16_t handle;
mridup 29:1870b03aa25b 272
mridup 30:555e6697b368 273 //DEBUG("BlueNRGGattServer::getCharacteristicFromHandle()>>Attribute Handle received 0x%x\n\r",attrHandle);
mridup 27:b4c21a9e8b39 274 for(i=0; i<characteristicCount; i++)
mridup 27:b4c21a9e8b39 275 {
mridup 27:b4c21a9e8b39 276 handle = p_characteristics[i]->getHandle();
mridup 29:1870b03aa25b 277
mridup 29:1870b03aa25b 278 if(i==characteristicCount-1)//Last Characteristic check
mridup 27:b4c21a9e8b39 279 {
mridup 29:1870b03aa25b 280 if(attrHandle>=bleCharacteristicHandles[handle])
mridup 29:1870b03aa25b 281 {
mridup 29:1870b03aa25b 282 p_char = p_characteristics[i];
mridup 29:1870b03aa25b 283 //DEBUG("Found Characteristic Properties 0x%x\n\r",p_char->getProperties());
mridup 29:1870b03aa25b 284 break;
mridup 29:1870b03aa25b 285 }
mridup 29:1870b03aa25b 286 }
mridup 29:1870b03aa25b 287 else {
mridup 29:1870b03aa25b 288 //Testing if attribute handle is between two Characteristic Handles
mridup 30:555e6697b368 289 if(attrHandle>=bleCharacteristicHandles[handle] && attrHandle<bleCharacteristicHandles[handle+1])
mridup 29:1870b03aa25b 290 {
mridup 29:1870b03aa25b 291 p_char = p_characteristics[i];
mridup 29:1870b03aa25b 292 //DEBUG("Found Characteristic Properties 0x%x\n\r",p_char->getProperties());
mridup 29:1870b03aa25b 293 break;
mridup 29:1870b03aa25b 294 } else continue;
mridup 27:b4c21a9e8b39 295 }
mridup 27:b4c21a9e8b39 296 }
mridup 27:b4c21a9e8b39 297 return p_char;
mridup 27:b4c21a9e8b39 298 }