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:
Mon Dec 16 20:00:05 2013 +0000
Revision:
10:f905b036bb07
Parent:
9:124ae067ae27
Child:
11:200931be5617
Further advertising tests

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