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:
Thu Dec 19 14:02:49 2013 +0000
Revision:
20:c6ceaa206674
Parent:
17:9eb2b6fbbda9
Child:
23:f19c60478e1b
Switched to main mbed library

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