Bill Schilit / BLE_API

Fork of BLE_API by Bluetooth Low Energy

Committer:
ktownsend
Date:
Wed Dec 18 12:07:38 2013 +0000
Revision:
15:327d7329072c
Parent:
14:6ea5d1012a64
Child:
16:542a9db01350
Cleanup for GAP publication (iBeacon working)

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