High level Bluetooth Low Energy API and radio abstraction layer

Dependencies:   nRF51822

Dependents:   LinkNode_LIS3DH

Fork of BLE_API by Bluetooth Low Energy

Committer:
ktownsend
Date:
Tue Jan 07 19:58:06 2014 +0000
Revision:
23:f19c60478e1b
Parent:
20:c6ceaa206674
Added GattService example

Who changed what in which revision?

UserRevisionLine numberNew contents of line
ktownsend 0:ace2e8d3ce79 1 #include "nrf51822.h"
ktownsend 0:ace2e8d3ce79 2 #include "mbed.h"
ktownsend 0:ace2e8d3ce79 3
ktownsend 0:ace2e8d3ce79 4 /**************************************************************************/
ktownsend 0:ace2e8d3ce79 5 /*!
ktownsend 0:ace2e8d3ce79 6 @brief UART callback function
ktownsend 0:ace2e8d3ce79 7 */
ktownsend 0:ace2e8d3ce79 8 /**************************************************************************/
ktownsend 0:ace2e8d3ce79 9 void nRF51822::uartCallback(void)
ktownsend 0:ace2e8d3ce79 10 {
ktownsend 0:ace2e8d3ce79 11 /* ToDo: Check responses and set a flag for success/error/etc. */
ktownsend 0:ace2e8d3ce79 12
ktownsend 0:ace2e8d3ce79 13 /* Read serial to clear the RX interrupt */
ktownsend 20:c6ceaa206674 14 uart.getc();
ktownsend 0:ace2e8d3ce79 15 }
ktownsend 0:ace2e8d3ce79 16
ktownsend 0:ace2e8d3ce79 17 /**************************************************************************/
ktownsend 0:ace2e8d3ce79 18 /*!
ktownsend 0:ace2e8d3ce79 19 @brief Constructor
ktownsend 0:ace2e8d3ce79 20 */
ktownsend 0:ace2e8d3ce79 21 /**************************************************************************/
ktownsend 9:124ae067ae27 22 nRF51822::nRF51822() : uart(p9, p10)
ktownsend 0:ace2e8d3ce79 23 {
ktownsend 0:ace2e8d3ce79 24 /* Setup the nRF UART interface */
ktownsend 0:ace2e8d3ce79 25 uart.baud(9600);
ktownsend 2:ffc5216bd2cc 26
ktownsend 0:ace2e8d3ce79 27 /* Echo data on the debug CDC port */
ktownsend 0:ace2e8d3ce79 28 uart.attach(this, &nRF51822::uartCallback);
ktownsend 0:ace2e8d3ce79 29
ktownsend 0:ace2e8d3ce79 30 /* Add flow control for UART (required by the nRF51822) */
ktownsend 17:9eb2b6fbbda9 31 uart.set_flow_control(RawSerial::RTSCTS, p30, p29);
ktownsend 2:ffc5216bd2cc 32
ktownsend 23:f19c60478e1b 33 /* Reset the service and characteristic counters */
ktownsend 0:ace2e8d3ce79 34 serviceCount = 0;
ktownsend 23:f19c60478e1b 35 characteristicCount = 0;
ktownsend 0:ace2e8d3ce79 36 }
ktownsend 0:ace2e8d3ce79 37
ktownsend 0:ace2e8d3ce79 38 /**************************************************************************/
ktownsend 0:ace2e8d3ce79 39 /*!
ktownsend 0:ace2e8d3ce79 40 @brief Destructor
ktownsend 0:ace2e8d3ce79 41 */
ktownsend 0:ace2e8d3ce79 42 /**************************************************************************/
ktownsend 0:ace2e8d3ce79 43 nRF51822::~nRF51822(void)
ktownsend 0:ace2e8d3ce79 44 {
ktownsend 0:ace2e8d3ce79 45 }
ktownsend 0:ace2e8d3ce79 46
ktownsend 0:ace2e8d3ce79 47 /**************************************************************************/
ktownsend 0:ace2e8d3ce79 48 /*!
ktownsend 7:5e1f0d7f7c7d 49 @brief Sets the advertising parameters and payload for the device
ktownsend 0:ace2e8d3ce79 50
ktownsend 7:5e1f0d7f7c7d 51 @param[in] params
ktownsend 7:5e1f0d7f7c7d 52 Basic advertising details, including the advertising
ktownsend 7:5e1f0d7f7c7d 53 delay, timeout and how the device should be advertised
ktownsend 7:5e1f0d7f7c7d 54 @params[in] advData
ktownsend 7:5e1f0d7f7c7d 55 The primary advertising data payload
ktownsend 7:5e1f0d7f7c7d 56 @params[in] scanResponse
ktownsend 7:5e1f0d7f7c7d 57 The optional Scan Response payload if the advertising
ktownsend 7:5e1f0d7f7c7d 58 type is set to \ref GapAdvertisingParams::ADV_SCANNABLE_UNDIRECTED
ktownsend 7:5e1f0d7f7c7d 59 in \ref GapAdveritinngParams
ktownsend 7:5e1f0d7f7c7d 60
ktownsend 9:124ae067ae27 61 @returns \ref ble_error_t
ktownsend 7:5e1f0d7f7c7d 62
ktownsend 7:5e1f0d7f7c7d 63 @retval BLE_ERROR_NONE
ktownsend 7:5e1f0d7f7c7d 64 Everything executed properly
ktownsend 7:5e1f0d7f7c7d 65
ktownsend 7:5e1f0d7f7c7d 66 @retval BLE_ERROR_BUFFER_OVERFLOW
ktownsend 7:5e1f0d7f7c7d 67 The proposed action would cause a buffer overflow. All
ktownsend 9:124ae067ae27 68 advertising payloads must be <= 31 bytes, for example.
ktownsend 7:5e1f0d7f7c7d 69
ktownsend 9:124ae067ae27 70 @retval BLE_ERROR_NOT_IMPLEMENTED
ktownsend 9:124ae067ae27 71 A feature was requested that is not yet supported in the
ktownsend 9:124ae067ae27 72 nRF51 firmware or hardware.
ktownsend 9:124ae067ae27 73
ktownsend 9:124ae067ae27 74 @retval BLE_ERROR_PARAM_OUT_OF_RANGE
ktownsend 9:124ae067ae27 75 One of the proposed values is outside the valid range.
ktownsend 9:124ae067ae27 76
ktownsend 7:5e1f0d7f7c7d 77 @section EXAMPLE
ktownsend 7:5e1f0d7f7c7d 78
ktownsend 7:5e1f0d7f7c7d 79 @code
ktownsend 7:5e1f0d7f7c7d 80
ktownsend 7:5e1f0d7f7c7d 81 @endcode
ktownsend 0:ace2e8d3ce79 82 */
ktownsend 0:ace2e8d3ce79 83 /**************************************************************************/
ktownsend 7:5e1f0d7f7c7d 84 ble_error_t nRF51822::setAdvertising(GapAdvertisingParams & params, GapAdvertisingData & advData, GapAdvertisingData & scanResponse)
ktownsend 2:ffc5216bd2cc 85 {
ktownsend 7:5e1f0d7f7c7d 86 uint8_t len = 0;
ktownsend 7:5e1f0d7f7c7d 87 uint8_t *buffer;
ktownsend 9:124ae067ae27 88
ktownsend 9:124ae067ae27 89 /* Make sure we support the advertising type */
ktownsend 9:124ae067ae27 90 if (params.getAdvertisingType() == GapAdvertisingParams::ADV_CONNECTABLE_DIRECTED)
ktownsend 9:124ae067ae27 91 {
ktownsend 16:542a9db01350 92 /* ToDo: This requires a propery security implementation, etc. */
ktownsend 9:124ae067ae27 93 return BLE_ERROR_NOT_IMPLEMENTED;
ktownsend 9:124ae067ae27 94 }
ktownsend 9:124ae067ae27 95
ktownsend 9:124ae067ae27 96 /* Check interval range */
ktownsend 15:327d7329072c 97 if (params.getAdvertisingType() == GapAdvertisingParams::ADV_NON_CONNECTABLE_UNDIRECTED)
ktownsend 9:124ae067ae27 98 {
ktownsend 15:327d7329072c 99 /* Min delay is slightly longer for unconnectable devices */
ktownsend 15:327d7329072c 100 if ((params.getInterval() < GAP_ADV_PARAMS_INTERVAL_MIN_NONCON) ||
ktownsend 15:327d7329072c 101 (params.getInterval() > GAP_ADV_PARAMS_INTERVAL_MAX))
ktownsend 15:327d7329072c 102 {
ktownsend 15:327d7329072c 103 return BLE_ERROR_PARAM_OUT_OF_RANGE;
ktownsend 15:327d7329072c 104 }
ktownsend 15:327d7329072c 105 }
ktownsend 15:327d7329072c 106 else
ktownsend 15:327d7329072c 107 {
ktownsend 15:327d7329072c 108 if ((params.getInterval() < GAP_ADV_PARAMS_INTERVAL_MIN) ||
ktownsend 15:327d7329072c 109 (params.getInterval() > GAP_ADV_PARAMS_INTERVAL_MAX))
ktownsend 15:327d7329072c 110 {
ktownsend 15:327d7329072c 111 return BLE_ERROR_PARAM_OUT_OF_RANGE;
ktownsend 15:327d7329072c 112 }
ktownsend 9:124ae067ae27 113 }
ktownsend 9:124ae067ae27 114
ktownsend 9:124ae067ae27 115 /* Check timeout is zero for Connectable Directed */
ktownsend 12:2c6b1059ed36 116 if ((params.getAdvertisingType() == GapAdvertisingParams::ADV_CONNECTABLE_DIRECTED) &&
ktownsend 9:124ae067ae27 117 (params.getTimeout() != 0))
ktownsend 9:124ae067ae27 118 {
ktownsend 9:124ae067ae27 119 /* Timeout must be 0 with this type, although we'll never get here */
ktownsend 9:124ae067ae27 120 /* since this isn't implemented yet anyway */
ktownsend 9:124ae067ae27 121 return BLE_ERROR_PARAM_OUT_OF_RANGE;
ktownsend 9:124ae067ae27 122 }
ktownsend 9:124ae067ae27 123
ktownsend 9:124ae067ae27 124 /* Check timeout for other advertising types */
ktownsend 12:2c6b1059ed36 125 if ((params.getAdvertisingType() != GapAdvertisingParams::ADV_CONNECTABLE_DIRECTED) &&
ktownsend 11:200931be5617 126 (params.getTimeout() > GAP_ADV_PARAMS_TIMEOUT_MAX))
ktownsend 9:124ae067ae27 127 {
ktownsend 9:124ae067ae27 128 return BLE_ERROR_PARAM_OUT_OF_RANGE;
ktownsend 9:124ae067ae27 129 }
ktownsend 7:5e1f0d7f7c7d 130
ktownsend 9:124ae067ae27 131 /* Make sure we don't exceed the advertising payload length */
ktownsend 9:124ae067ae27 132 if (advData.getPayloadLen() > GAP_ADVERTISING_DATA_MAX_PAYLOAD)
ktownsend 7:5e1f0d7f7c7d 133 {
ktownsend 7:5e1f0d7f7c7d 134 return BLE_ERROR_BUFFER_OVERFLOW;
ktownsend 7:5e1f0d7f7c7d 135 }
ktownsend 7:5e1f0d7f7c7d 136
ktownsend 16:542a9db01350 137 /* Check the scan response payload limits */
ktownsend 9:124ae067ae27 138 if ((params.getAdvertisingType() == GapAdvertisingParams::ADV_SCANNABLE_UNDIRECTED))
ktownsend 9:124ae067ae27 139 {
ktownsend 16:542a9db01350 140 /* Check if we're within the upper limit */
ktownsend 9:124ae067ae27 141 if (advData.getPayloadLen() > GAP_ADVERTISING_DATA_MAX_PAYLOAD)
ktownsend 9:124ae067ae27 142 {
ktownsend 9:124ae067ae27 143 return BLE_ERROR_BUFFER_OVERFLOW;
ktownsend 9:124ae067ae27 144 }
ktownsend 16:542a9db01350 145 /* Make sure we have a payload! */
ktownsend 16:542a9db01350 146 if (advData.getPayloadLen() == 0)
ktownsend 16:542a9db01350 147 {
ktownsend 16:542a9db01350 148 return BLE_ERROR_PARAM_OUT_OF_RANGE;
ktownsend 16:542a9db01350 149 }
ktownsend 9:124ae067ae27 150 }
ktownsend 9:124ae067ae27 151
ktownsend 9:124ae067ae27 152 /* ToDo: Perform some checks on the payload, for example the Scan Response can't */
ktownsend 9:124ae067ae27 153 /* contains a flags AD type, etc. */
ktownsend 9:124ae067ae27 154
ktownsend 9:124ae067ae27 155 /* ToDo: Refactor these actions into separate private functions */
ktownsend 9:124ae067ae27 156
ktownsend 9:124ae067ae27 157 /* 1.) Send advertising params, Command IDs = 0x000C, 0x000D, 0x000E */
ktownsend 9:124ae067ae27 158 /* A.) Command ID = 0x000C, Advertising Interval, uint16_t */
ktownsend 9:124ae067ae27 159 uart.printf("10 0C 00 02 %02X %02X\r\n", (uint8_t)(params.getInterval() & 0xFF),
ktownsend 9:124ae067ae27 160 (uint8_t)(params.getInterval() >> 8));
ktownsend 9:124ae067ae27 161 /* ToDo: Check response */
ktownsend 9:124ae067ae27 162 wait(0.5);
ktownsend 9:124ae067ae27 163
ktownsend 9:124ae067ae27 164 /* B.) Command ID = 0x000D, Advertising Timeout, uint16_t */
ktownsend 9:124ae067ae27 165 uart.printf("10 0D 00 02 %02X %02X\r\n", (uint8_t)(params.getTimeout() & 0xFF),
ktownsend 9:124ae067ae27 166 (uint8_t)(params.getTimeout() >> 8));
ktownsend 9:124ae067ae27 167 /* ToDo: Check response */
ktownsend 9:124ae067ae27 168 wait(0.5);
ktownsend 9:124ae067ae27 169
ktownsend 9:124ae067ae27 170 /* C.) Command ID = 0x000E, Advertising Type, uint8_t */
ktownsend 9:124ae067ae27 171 uart.printf("10 0E 00 01 %02X\r\n", (uint8_t)(params.getAdvertisingType()));
ktownsend 9:124ae067ae27 172 /* ToDo: Check response */
ktownsend 9:124ae067ae27 173 wait(0.5);
ktownsend 9:124ae067ae27 174
ktownsend 9:124ae067ae27 175 /* 2.) Send advertising data, Command ID = 0x000A */
ktownsend 9:124ae067ae27 176 len = advData.getPayloadLen();
ktownsend 14:6ea5d1012a64 177 buffer = advData.getPayload();
ktownsend 14:6ea5d1012a64 178 uart.printf("10 0A 00 %02X", len);
ktownsend 7:5e1f0d7f7c7d 179 for (uint16_t i = 0; i < len; i++)
ktownsend 7:5e1f0d7f7c7d 180 {
ktownsend 7:5e1f0d7f7c7d 181 uart.printf(" %02X", buffer[i]);
ktownsend 13:a585c98b6abc 182 }
ktownsend 7:5e1f0d7f7c7d 183 uart.printf("\r\n");
ktownsend 7:5e1f0d7f7c7d 184
ktownsend 7:5e1f0d7f7c7d 185 /* ToDo: Check response */
ktownsend 7:5e1f0d7f7c7d 186 wait(0.1);
ktownsend 7:5e1f0d7f7c7d 187
ktownsend 10:f905b036bb07 188 /* 3.) Send scan response data, Command ID = 0x000B */
ktownsend 7:5e1f0d7f7c7d 189 if ((params.getAdvertisingType() == GapAdvertisingParams::ADV_SCANNABLE_UNDIRECTED))
ktownsend 7:5e1f0d7f7c7d 190 {
ktownsend 16:542a9db01350 191 len = scanResponse.getPayloadLen();
ktownsend 16:542a9db01350 192 buffer = scanResponse.getPayload();
ktownsend 14:6ea5d1012a64 193 uart.printf("10 0B 00 %02X", len);
ktownsend 7:5e1f0d7f7c7d 194 for (uint16_t i = 0; i < len; i++)
ktownsend 7:5e1f0d7f7c7d 195 {
ktownsend 7:5e1f0d7f7c7d 196 uart.printf(" %02X", buffer[i]);
ktownsend 7:5e1f0d7f7c7d 197 }
ktownsend 7:5e1f0d7f7c7d 198 uart.printf("\r\n");
ktownsend 10:f905b036bb07 199
ktownsend 7:5e1f0d7f7c7d 200 /* ToDo: Check response */
ktownsend 7:5e1f0d7f7c7d 201 wait(0.1);
ktownsend 7:5e1f0d7f7c7d 202 }
ktownsend 7:5e1f0d7f7c7d 203
ktownsend 2:ffc5216bd2cc 204 return BLE_ERROR_NONE;
ktownsend 2:ffc5216bd2cc 205 }
ktownsend 2:ffc5216bd2cc 206
ktownsend 2:ffc5216bd2cc 207 /**************************************************************************/
ktownsend 2:ffc5216bd2cc 208 /*!
ktownsend 7:5e1f0d7f7c7d 209 @brief Adds a new service to the GATT table on the peripheral
ktownsend 7:5e1f0d7f7c7d 210
ktownsend 7:5e1f0d7f7c7d 211 @returns ble_error_t
ktownsend 7:5e1f0d7f7c7d 212
ktownsend 7:5e1f0d7f7c7d 213 @retval BLE_ERROR_NONE
ktownsend 7:5e1f0d7f7c7d 214 Everything executed properly
ktownsend 7:5e1f0d7f7c7d 215
ktownsend 7:5e1f0d7f7c7d 216 @section EXAMPLE
ktownsend 2:ffc5216bd2cc 217
ktownsend 7:5e1f0d7f7c7d 218 @code
ktownsend 7:5e1f0d7f7c7d 219
ktownsend 7:5e1f0d7f7c7d 220 @endcode
ktownsend 2:ffc5216bd2cc 221 */
ktownsend 2:ffc5216bd2cc 222 /**************************************************************************/
ktownsend 2:ffc5216bd2cc 223 ble_error_t nRF51822::addService(GattService & service)
ktownsend 0:ace2e8d3ce79 224 {
ktownsend 0:ace2e8d3ce79 225 /* ToDo: Make sure we don't overflow the array, etc. */
ktownsend 0:ace2e8d3ce79 226 /* ToDo: Make sure this service UUID doesn't already exist (?) */
ktownsend 0:ace2e8d3ce79 227 /* ToDo: Basic validation */
ktownsend 0:ace2e8d3ce79 228
ktownsend 0:ace2e8d3ce79 229 /* Add the service to the nRF51 */
ktownsend 0:ace2e8d3ce79 230 if (service.primaryServiceID.type == UUID::UUID_TYPE_SHORT)
ktownsend 0:ace2e8d3ce79 231 {
ktownsend 0:ace2e8d3ce79 232 /* 16-bit BLE UUID */
ktownsend 0:ace2e8d3ce79 233 uart.printf("10 01 00 04 01 02 %02X %02X\r\n",
ktownsend 0:ace2e8d3ce79 234 service.primaryServiceID.value & 0xFF,
ktownsend 0:ace2e8d3ce79 235 service.primaryServiceID.value >> 8);
ktownsend 0:ace2e8d3ce79 236 }
ktownsend 0:ace2e8d3ce79 237 else
ktownsend 0:ace2e8d3ce79 238 {
ktownsend 0:ace2e8d3ce79 239 /* 128-bit Custom UUID */
ktownsend 0:ace2e8d3ce79 240 uart.printf("10 01 00 12 01 10 %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X\r\n",
ktownsend 0:ace2e8d3ce79 241 service.primaryServiceID.base[0],
ktownsend 0:ace2e8d3ce79 242 service.primaryServiceID.base[1],
ktownsend 0:ace2e8d3ce79 243 service.primaryServiceID.base[2],
ktownsend 0:ace2e8d3ce79 244 service.primaryServiceID.base[3],
ktownsend 0:ace2e8d3ce79 245 service.primaryServiceID.base[4],
ktownsend 0:ace2e8d3ce79 246 service.primaryServiceID.base[5],
ktownsend 0:ace2e8d3ce79 247 service.primaryServiceID.base[6],
ktownsend 0:ace2e8d3ce79 248 service.primaryServiceID.base[7],
ktownsend 0:ace2e8d3ce79 249 service.primaryServiceID.base[8],
ktownsend 0:ace2e8d3ce79 250 service.primaryServiceID.base[9],
ktownsend 0:ace2e8d3ce79 251 service.primaryServiceID.base[10],
ktownsend 0:ace2e8d3ce79 252 service.primaryServiceID.base[11],
ktownsend 0:ace2e8d3ce79 253 service.primaryServiceID.base[12],
ktownsend 0:ace2e8d3ce79 254 service.primaryServiceID.base[13],
ktownsend 0:ace2e8d3ce79 255 service.primaryServiceID.base[14],
ktownsend 0:ace2e8d3ce79 256 service.primaryServiceID.base[15]);
ktownsend 0:ace2e8d3ce79 257 }
ktownsend 0:ace2e8d3ce79 258
ktownsend 0:ace2e8d3ce79 259 /* ToDo: Check response */
ktownsend 0:ace2e8d3ce79 260 wait(0.1);
ktownsend 0:ace2e8d3ce79 261
ktownsend 0:ace2e8d3ce79 262 /* Add characteristics to the service */
ktownsend 0:ace2e8d3ce79 263 for (uint8_t i = 0; i < service.characteristicCount; i++)
ktownsend 0:ace2e8d3ce79 264 {
ktownsend 0:ace2e8d3ce79 265 /* Command ID = 0x0002 */
ktownsend 0:ace2e8d3ce79 266 uart.printf("10 02 00 0F 01 02 %02X %02X 04 02 %02X %02X 05 02 %02X %02X 03 01 %02X\r\n",
ktownsend 23:f19c60478e1b 267 service.characteristics[i].uuid & 0xFF,
ktownsend 23:f19c60478e1b 268 service.characteristics[i].uuid >> 8,
ktownsend 0:ace2e8d3ce79 269 service.characteristics[i].lenMin & 0xFF,
ktownsend 0:ace2e8d3ce79 270 service.characteristics[i].lenMin >> 8,
ktownsend 0:ace2e8d3ce79 271 service.characteristics[i].lenMax & 0xFF,
ktownsend 0:ace2e8d3ce79 272 service.characteristics[i].lenMax >> 8,
ktownsend 0:ace2e8d3ce79 273 service.characteristics[i].properties);
ktownsend 0:ace2e8d3ce79 274
ktownsend 0:ace2e8d3ce79 275 /* ToDo: Check response */
ktownsend 0:ace2e8d3ce79 276 wait(0.1);
ktownsend 23:f19c60478e1b 277
ktownsend 23:f19c60478e1b 278 /* Update the characteristic handle */
ktownsend 23:f19c60478e1b 279 service.characteristics[i].handle = characteristicCount;
ktownsend 23:f19c60478e1b 280 characteristicCount++;
ktownsend 23:f19c60478e1b 281 }
ktownsend 0:ace2e8d3ce79 282
ktownsend 23:f19c60478e1b 283 /* Update the service handle */
ktownsend 11:200931be5617 284 service.handle = serviceCount;
ktownsend 0:ace2e8d3ce79 285 serviceCount++;
ktownsend 0:ace2e8d3ce79 286
ktownsend 0:ace2e8d3ce79 287 return BLE_ERROR_NONE;
ktownsend 0:ace2e8d3ce79 288 }
ktownsend 0:ace2e8d3ce79 289
ktownsend 0:ace2e8d3ce79 290 /**************************************************************************/
ktownsend 0:ace2e8d3ce79 291 /*!
ktownsend 2:ffc5216bd2cc 292 @brief Reads the value of a characteristic, based on the service
ktownsend 2:ffc5216bd2cc 293 and characteristic index fields
ktownsend 2:ffc5216bd2cc 294
ktownsend 23:f19c60478e1b 295 @param[in] charHandle
ktownsend 23:f19c60478e1b 296 The handle of the GattCharacteristic to read from
ktownsend 2:ffc5216bd2cc 297 @param[in] buffer
ktownsend 2:ffc5216bd2cc 298 Buffer to hold the the characteristic's value
ktownsend 2:ffc5216bd2cc 299 (raw byte array in LSB format)
ktownsend 2:ffc5216bd2cc 300 @param[in] len
ktownsend 2:ffc5216bd2cc 301 The number of bytes read into the buffer
ktownsend 7:5e1f0d7f7c7d 302
ktownsend 7:5e1f0d7f7c7d 303 @returns ble_error_t
ktownsend 7:5e1f0d7f7c7d 304
ktownsend 7:5e1f0d7f7c7d 305 @retval BLE_ERROR_NONE
ktownsend 7:5e1f0d7f7c7d 306 Everything executed properly
ktownsend 7:5e1f0d7f7c7d 307
ktownsend 7:5e1f0d7f7c7d 308 @section EXAMPLE
ktownsend 7:5e1f0d7f7c7d 309
ktownsend 7:5e1f0d7f7c7d 310 @code
ktownsend 7:5e1f0d7f7c7d 311
ktownsend 7:5e1f0d7f7c7d 312 @endcode
ktownsend 2:ffc5216bd2cc 313 */
ktownsend 2:ffc5216bd2cc 314 /**************************************************************************/
ktownsend 23:f19c60478e1b 315 ble_error_t nRF51822::readCharacteristic(uint8_t charHandle, uint8_t buffer[], uint16_t len)
ktownsend 2:ffc5216bd2cc 316 {
ktownsend 2:ffc5216bd2cc 317 /* ToDo */
ktownsend 2:ffc5216bd2cc 318
ktownsend 2:ffc5216bd2cc 319 return BLE_ERROR_NONE;
ktownsend 2:ffc5216bd2cc 320 }
ktownsend 2:ffc5216bd2cc 321
ktownsend 2:ffc5216bd2cc 322 /**************************************************************************/
ktownsend 2:ffc5216bd2cc 323 /*!
ktownsend 0:ace2e8d3ce79 324 @brief Updates the value of a characteristic, based on the service
ktownsend 0:ace2e8d3ce79 325 and characteristic index fields
ktownsend 23:f19c60478e1b 326
ktownsend 23:f19c60478e1b 327 @param[in] charHandle
ktownsend 23:f19c60478e1b 328 The handle of the GattCharacteristic to write to
ktownsend 0:ace2e8d3ce79 329 @param[in] buffer
ktownsend 0:ace2e8d3ce79 330 Data to use when updating the characteristic's value
ktownsend 0:ace2e8d3ce79 331 (raw byte array in LSB format)
ktownsend 0:ace2e8d3ce79 332 @param[in] len
ktownsend 0:ace2e8d3ce79 333 The number of bytes in buffer
ktownsend 7:5e1f0d7f7c7d 334
ktownsend 7:5e1f0d7f7c7d 335 @returns ble_error_t
ktownsend 7:5e1f0d7f7c7d 336
ktownsend 7:5e1f0d7f7c7d 337 @retval BLE_ERROR_NONE
ktownsend 7:5e1f0d7f7c7d 338 Everything executed properly
ktownsend 7:5e1f0d7f7c7d 339
ktownsend 7:5e1f0d7f7c7d 340 @section EXAMPLE
ktownsend 7:5e1f0d7f7c7d 341
ktownsend 7:5e1f0d7f7c7d 342 @code
ktownsend 7:5e1f0d7f7c7d 343
ktownsend 7:5e1f0d7f7c7d 344 @endcode
ktownsend 0:ace2e8d3ce79 345 */
ktownsend 0:ace2e8d3ce79 346 /**************************************************************************/
ktownsend 23:f19c60478e1b 347 ble_error_t nRF51822::writeCharacteristic(uint8_t charHandle, uint8_t buffer[], uint16_t len)
ktownsend 0:ace2e8d3ce79 348 {
ktownsend 23:f19c60478e1b 349 /* Command ID = 0x0006, Payload = Characteristic ID, Value */
ktownsend 23:f19c60478e1b 350 uart.printf("10 06 00 %02X %02X", len + 1, charHandle);
ktownsend 0:ace2e8d3ce79 351 for (uint16_t i = 0; i<len; i++)
ktownsend 0:ace2e8d3ce79 352 {
ktownsend 0:ace2e8d3ce79 353 uart.printf(" %02X", buffer[i]);
ktownsend 0:ace2e8d3ce79 354 }
ktownsend 0:ace2e8d3ce79 355 uart.printf("\r\n");
ktownsend 0:ace2e8d3ce79 356
ktownsend 0:ace2e8d3ce79 357 /* ToDo: Check response */
ktownsend 0:ace2e8d3ce79 358 wait(0.1);
ktownsend 0:ace2e8d3ce79 359
ktownsend 0:ace2e8d3ce79 360 return BLE_ERROR_NONE;
ktownsend 0:ace2e8d3ce79 361 }
ktownsend 0:ace2e8d3ce79 362
ktownsend 0:ace2e8d3ce79 363 /**************************************************************************/
ktownsend 0:ace2e8d3ce79 364 /*!
ktownsend 0:ace2e8d3ce79 365 @brief Starts the BLE HW, initialising any services that were
ktownsend 0:ace2e8d3ce79 366 added before this function was called.
ktownsend 0:ace2e8d3ce79 367
ktownsend 0:ace2e8d3ce79 368 @note All services must be added before calling this function!
ktownsend 7:5e1f0d7f7c7d 369
ktownsend 7:5e1f0d7f7c7d 370 @returns ble_error_t
ktownsend 7:5e1f0d7f7c7d 371
ktownsend 7:5e1f0d7f7c7d 372 @retval BLE_ERROR_NONE
ktownsend 7:5e1f0d7f7c7d 373 Everything executed properly
ktownsend 7:5e1f0d7f7c7d 374
ktownsend 7:5e1f0d7f7c7d 375 @section EXAMPLE
ktownsend 7:5e1f0d7f7c7d 376
ktownsend 7:5e1f0d7f7c7d 377 @code
ktownsend 7:5e1f0d7f7c7d 378
ktownsend 7:5e1f0d7f7c7d 379 @endcode
ktownsend 0:ace2e8d3ce79 380 */
ktownsend 0:ace2e8d3ce79 381 /**************************************************************************/
ktownsend 0:ace2e8d3ce79 382 ble_error_t nRF51822::start(void)
ktownsend 0:ace2e8d3ce79 383 {
ktownsend 0:ace2e8d3ce79 384 /* Command ID = 0x0003, No payload */
ktownsend 0:ace2e8d3ce79 385 uart.printf("10 03 00 00\r\n");
ktownsend 0:ace2e8d3ce79 386
ktownsend 0:ace2e8d3ce79 387 /* ToDo: Check response */
ktownsend 0:ace2e8d3ce79 388 wait(0.5);
ktownsend 0:ace2e8d3ce79 389
ktownsend 0:ace2e8d3ce79 390 return BLE_ERROR_NONE;
ktownsend 0:ace2e8d3ce79 391 }
ktownsend 0:ace2e8d3ce79 392
ktownsend 0:ace2e8d3ce79 393 /**************************************************************************/
ktownsend 0:ace2e8d3ce79 394 /*!
ktownsend 0:ace2e8d3ce79 395 @brief Stops the BLE HW and disconnects from any devices
ktownsend 7:5e1f0d7f7c7d 396
ktownsend 7:5e1f0d7f7c7d 397 @returns ble_error_t
ktownsend 7:5e1f0d7f7c7d 398
ktownsend 7:5e1f0d7f7c7d 399 @retval BLE_ERROR_NONE
ktownsend 7:5e1f0d7f7c7d 400 Everything executed properly
ktownsend 7:5e1f0d7f7c7d 401
ktownsend 7:5e1f0d7f7c7d 402 @section EXAMPLE
ktownsend 7:5e1f0d7f7c7d 403
ktownsend 7:5e1f0d7f7c7d 404 @code
ktownsend 7:5e1f0d7f7c7d 405
ktownsend 7:5e1f0d7f7c7d 406 @endcode
ktownsend 0:ace2e8d3ce79 407 */
ktownsend 0:ace2e8d3ce79 408 /**************************************************************************/
ktownsend 0:ace2e8d3ce79 409 ble_error_t nRF51822::stop(void)
ktownsend 0:ace2e8d3ce79 410 {
ktownsend 0:ace2e8d3ce79 411 /* Command ID = 0x0004, No payload */
ktownsend 0:ace2e8d3ce79 412 uart.printf("10 04 00 00\r\n");
ktownsend 0:ace2e8d3ce79 413
ktownsend 0:ace2e8d3ce79 414 /* ToDo: Check response */
ktownsend 0:ace2e8d3ce79 415 wait(0.1);
ktownsend 0:ace2e8d3ce79 416
ktownsend 0:ace2e8d3ce79 417 return BLE_ERROR_NONE;
ktownsend 0:ace2e8d3ce79 418 }
ktownsend 0:ace2e8d3ce79 419
ktownsend 0:ace2e8d3ce79 420 /**************************************************************************/
ktownsend 0:ace2e8d3ce79 421 /*!
ktownsend 0:ace2e8d3ce79 422 @brief Resets the BLE HW, removing any existing services and
ktownsend 0:ace2e8d3ce79 423 characteristics
ktownsend 7:5e1f0d7f7c7d 424
ktownsend 7:5e1f0d7f7c7d 425 @returns ble_error_t
ktownsend 7:5e1f0d7f7c7d 426
ktownsend 7:5e1f0d7f7c7d 427 @retval BLE_ERROR_NONE
ktownsend 7:5e1f0d7f7c7d 428 Everything executed properly
ktownsend 7:5e1f0d7f7c7d 429
ktownsend 7:5e1f0d7f7c7d 430 @section EXAMPLE
ktownsend 7:5e1f0d7f7c7d 431
ktownsend 7:5e1f0d7f7c7d 432 @code
ktownsend 7:5e1f0d7f7c7d 433
ktownsend 7:5e1f0d7f7c7d 434 @endcode
ktownsend 0:ace2e8d3ce79 435 */
ktownsend 0:ace2e8d3ce79 436 /**************************************************************************/
ktownsend 0:ace2e8d3ce79 437 ble_error_t nRF51822::reset(void)
ktownsend 0:ace2e8d3ce79 438 {
ktownsend 0:ace2e8d3ce79 439 /* Command ID = 0x0005, No payload */
ktownsend 0:ace2e8d3ce79 440 uart.printf("10 05 00 00\r\n");
ktownsend 0:ace2e8d3ce79 441
ktownsend 23:f19c60478e1b 442 /* Reset the service and characteristic counters */
ktownsend 0:ace2e8d3ce79 443 serviceCount = 0;
ktownsend 23:f19c60478e1b 444 characteristicCount = 0;
ktownsend 0:ace2e8d3ce79 445
ktownsend 0:ace2e8d3ce79 446 /* Wait for the radio to come back up */
ktownsend 0:ace2e8d3ce79 447 wait(1);
ktownsend 0:ace2e8d3ce79 448
ktownsend 0:ace2e8d3ce79 449 return BLE_ERROR_NONE;
ktownsend 0:ace2e8d3ce79 450 }