Bill Schilit / BLE_API

Fork of BLE_API by Bluetooth Low Energy

Committer:
ktownsend
Date:
Wed Dec 18 19:15:07 2013 +0000
Revision:
17:9eb2b6fbbda9
Parent:
16:542a9db01350
Child:
20:c6ceaa206674
Switched to RawSerial

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 16:542a9db01350 14 printf("%c", 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 printf("10 0A 00 %02X", len);
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 14:6ea5d1012a64 181 printf(" %02X", buffer[i]);
ktownsend 7:5e1f0d7f7c7d 182 uart.printf(" %02X", buffer[i]);
ktownsend 13:a585c98b6abc 183 }
ktownsend 14:6ea5d1012a64 184 printf("\r\n");
ktownsend 7:5e1f0d7f7c7d 185 uart.printf("\r\n");
ktownsend 7:5e1f0d7f7c7d 186
ktownsend 7:5e1f0d7f7c7d 187 /* ToDo: Check response */
ktownsend 7:5e1f0d7f7c7d 188 wait(0.1);
ktownsend 7:5e1f0d7f7c7d 189
ktownsend 10:f905b036bb07 190 /* 3.) Send scan response data, Command ID = 0x000B */
ktownsend 7:5e1f0d7f7c7d 191 if ((params.getAdvertisingType() == GapAdvertisingParams::ADV_SCANNABLE_UNDIRECTED))
ktownsend 7:5e1f0d7f7c7d 192 {
ktownsend 16:542a9db01350 193 len = scanResponse.getPayloadLen();
ktownsend 16:542a9db01350 194 buffer = scanResponse.getPayload();
ktownsend 14:6ea5d1012a64 195 printf("10 0B 00 %02X", len);
ktownsend 14:6ea5d1012a64 196 uart.printf("10 0B 00 %02X", len);
ktownsend 7:5e1f0d7f7c7d 197 for (uint16_t i = 0; i < len; i++)
ktownsend 7:5e1f0d7f7c7d 198 {
ktownsend 14:6ea5d1012a64 199 printf(" %02X", buffer[i]);
ktownsend 7:5e1f0d7f7c7d 200 uart.printf(" %02X", buffer[i]);
ktownsend 7:5e1f0d7f7c7d 201 }
ktownsend 14:6ea5d1012a64 202 printf("\r\n");
ktownsend 7:5e1f0d7f7c7d 203 uart.printf("\r\n");
ktownsend 10:f905b036bb07 204
ktownsend 7:5e1f0d7f7c7d 205 /* ToDo: Check response */
ktownsend 7:5e1f0d7f7c7d 206 wait(0.1);
ktownsend 7:5e1f0d7f7c7d 207 }
ktownsend 7:5e1f0d7f7c7d 208
ktownsend 2:ffc5216bd2cc 209 return BLE_ERROR_NONE;
ktownsend 2:ffc5216bd2cc 210 }
ktownsend 2:ffc5216bd2cc 211
ktownsend 2:ffc5216bd2cc 212 /**************************************************************************/
ktownsend 2:ffc5216bd2cc 213 /*!
ktownsend 7:5e1f0d7f7c7d 214 @brief Adds a new service to the GATT table on the peripheral
ktownsend 7:5e1f0d7f7c7d 215
ktownsend 7:5e1f0d7f7c7d 216 @returns ble_error_t
ktownsend 7:5e1f0d7f7c7d 217
ktownsend 7:5e1f0d7f7c7d 218 @retval BLE_ERROR_NONE
ktownsend 7:5e1f0d7f7c7d 219 Everything executed properly
ktownsend 7:5e1f0d7f7c7d 220
ktownsend 7:5e1f0d7f7c7d 221 @section EXAMPLE
ktownsend 2:ffc5216bd2cc 222
ktownsend 7:5e1f0d7f7c7d 223 @code
ktownsend 7:5e1f0d7f7c7d 224
ktownsend 7:5e1f0d7f7c7d 225 @endcode
ktownsend 2:ffc5216bd2cc 226 */
ktownsend 2:ffc5216bd2cc 227 /**************************************************************************/
ktownsend 2:ffc5216bd2cc 228 ble_error_t nRF51822::addService(GattService & service)
ktownsend 0:ace2e8d3ce79 229 {
ktownsend 0:ace2e8d3ce79 230 /* ToDo: Make sure we don't overflow the array, etc. */
ktownsend 0:ace2e8d3ce79 231 /* ToDo: Make sure this service UUID doesn't already exist (?) */
ktownsend 0:ace2e8d3ce79 232 /* ToDo: Basic validation */
ktownsend 0:ace2e8d3ce79 233
ktownsend 0:ace2e8d3ce79 234 /* Add the service to the nRF51 */
ktownsend 0:ace2e8d3ce79 235 if (service.primaryServiceID.type == UUID::UUID_TYPE_SHORT)
ktownsend 0:ace2e8d3ce79 236 {
ktownsend 0:ace2e8d3ce79 237 /* 16-bit BLE UUID */
ktownsend 0:ace2e8d3ce79 238 uart.printf("10 01 00 04 01 02 %02X %02X\r\n",
ktownsend 0:ace2e8d3ce79 239 service.primaryServiceID.value & 0xFF,
ktownsend 0:ace2e8d3ce79 240 service.primaryServiceID.value >> 8);
ktownsend 0:ace2e8d3ce79 241 }
ktownsend 0:ace2e8d3ce79 242 else
ktownsend 0:ace2e8d3ce79 243 {
ktownsend 0:ace2e8d3ce79 244 /* 128-bit Custom UUID */
ktownsend 0:ace2e8d3ce79 245 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 246 service.primaryServiceID.base[0],
ktownsend 0:ace2e8d3ce79 247 service.primaryServiceID.base[1],
ktownsend 0:ace2e8d3ce79 248 service.primaryServiceID.base[2],
ktownsend 0:ace2e8d3ce79 249 service.primaryServiceID.base[3],
ktownsend 0:ace2e8d3ce79 250 service.primaryServiceID.base[4],
ktownsend 0:ace2e8d3ce79 251 service.primaryServiceID.base[5],
ktownsend 0:ace2e8d3ce79 252 service.primaryServiceID.base[6],
ktownsend 0:ace2e8d3ce79 253 service.primaryServiceID.base[7],
ktownsend 0:ace2e8d3ce79 254 service.primaryServiceID.base[8],
ktownsend 0:ace2e8d3ce79 255 service.primaryServiceID.base[9],
ktownsend 0:ace2e8d3ce79 256 service.primaryServiceID.base[10],
ktownsend 0:ace2e8d3ce79 257 service.primaryServiceID.base[11],
ktownsend 0:ace2e8d3ce79 258 service.primaryServiceID.base[12],
ktownsend 0:ace2e8d3ce79 259 service.primaryServiceID.base[13],
ktownsend 0:ace2e8d3ce79 260 service.primaryServiceID.base[14],
ktownsend 0:ace2e8d3ce79 261 service.primaryServiceID.base[15]);
ktownsend 0:ace2e8d3ce79 262 }
ktownsend 0:ace2e8d3ce79 263
ktownsend 0:ace2e8d3ce79 264 /* ToDo: Check response */
ktownsend 0:ace2e8d3ce79 265 wait(0.1);
ktownsend 0:ace2e8d3ce79 266
ktownsend 0:ace2e8d3ce79 267 /* Add characteristics to the service */
ktownsend 0:ace2e8d3ce79 268 for (uint8_t i = 0; i < service.characteristicCount; i++)
ktownsend 0:ace2e8d3ce79 269 {
ktownsend 0:ace2e8d3ce79 270 /* Command ID = 0x0002 */
ktownsend 0:ace2e8d3ce79 271 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 272 service.characteristics[i].id & 0xFF,
ktownsend 0:ace2e8d3ce79 273 service.characteristics[i].id >> 8,
ktownsend 0:ace2e8d3ce79 274 service.characteristics[i].lenMin & 0xFF,
ktownsend 0:ace2e8d3ce79 275 service.characteristics[i].lenMin >> 8,
ktownsend 0:ace2e8d3ce79 276 service.characteristics[i].lenMax & 0xFF,
ktownsend 0:ace2e8d3ce79 277 service.characteristics[i].lenMax >> 8,
ktownsend 0:ace2e8d3ce79 278 service.characteristics[i].properties);
ktownsend 0:ace2e8d3ce79 279
ktownsend 0:ace2e8d3ce79 280 /* ToDo: Check response */
ktownsend 0:ace2e8d3ce79 281 wait(0.1);
ktownsend 0:ace2e8d3ce79 282 }
ktownsend 0:ace2e8d3ce79 283
ktownsend 0:ace2e8d3ce79 284 /* Update the service index value */
ktownsend 11:200931be5617 285 service.handle = serviceCount;
ktownsend 0:ace2e8d3ce79 286 serviceCount++;
ktownsend 0:ace2e8d3ce79 287
ktownsend 0:ace2e8d3ce79 288 return BLE_ERROR_NONE;
ktownsend 0:ace2e8d3ce79 289 }
ktownsend 0:ace2e8d3ce79 290
ktownsend 0:ace2e8d3ce79 291 /**************************************************************************/
ktownsend 0:ace2e8d3ce79 292 /*!
ktownsend 2:ffc5216bd2cc 293 @brief Reads the value of a characteristic, based on the service
ktownsend 2:ffc5216bd2cc 294 and characteristic index fields
ktownsend 2:ffc5216bd2cc 295
ktownsend 2:ffc5216bd2cc 296 @param[in] service
ktownsend 2:ffc5216bd2cc 297 The GattService to read from
ktownsend 2:ffc5216bd2cc 298 @param[in] characteristic
ktownsend 2:ffc5216bd2cc 299 The GattCharacteristic to read from
ktownsend 2:ffc5216bd2cc 300 @param[in] buffer
ktownsend 2:ffc5216bd2cc 301 Buffer to hold the the characteristic's value
ktownsend 2:ffc5216bd2cc 302 (raw byte array in LSB format)
ktownsend 2:ffc5216bd2cc 303 @param[in] len
ktownsend 2:ffc5216bd2cc 304 The number of bytes read into the buffer
ktownsend 7:5e1f0d7f7c7d 305
ktownsend 7:5e1f0d7f7c7d 306 @returns ble_error_t
ktownsend 7:5e1f0d7f7c7d 307
ktownsend 7:5e1f0d7f7c7d 308 @retval BLE_ERROR_NONE
ktownsend 7:5e1f0d7f7c7d 309 Everything executed properly
ktownsend 7:5e1f0d7f7c7d 310
ktownsend 7:5e1f0d7f7c7d 311 @section EXAMPLE
ktownsend 7:5e1f0d7f7c7d 312
ktownsend 7:5e1f0d7f7c7d 313 @code
ktownsend 7:5e1f0d7f7c7d 314
ktownsend 7:5e1f0d7f7c7d 315 @endcode
ktownsend 2:ffc5216bd2cc 316 */
ktownsend 2:ffc5216bd2cc 317 /**************************************************************************/
ktownsend 2:ffc5216bd2cc 318 ble_error_t nRF51822::readCharacteristic(GattService &service, GattCharacteristic &characteristic, uint8_t buffer[], uint16_t len)
ktownsend 2:ffc5216bd2cc 319 {
ktownsend 2:ffc5216bd2cc 320 /* ToDo */
ktownsend 2:ffc5216bd2cc 321
ktownsend 2:ffc5216bd2cc 322 return BLE_ERROR_NONE;
ktownsend 2:ffc5216bd2cc 323 }
ktownsend 2:ffc5216bd2cc 324
ktownsend 2:ffc5216bd2cc 325 /**************************************************************************/
ktownsend 2:ffc5216bd2cc 326 /*!
ktownsend 0:ace2e8d3ce79 327 @brief Updates the value of a characteristic, based on the service
ktownsend 0:ace2e8d3ce79 328 and characteristic index fields
ktownsend 0:ace2e8d3ce79 329
ktownsend 2:ffc5216bd2cc 330 @param[in] service
ktownsend 2:ffc5216bd2cc 331 The GattService to write to
ktownsend 2:ffc5216bd2cc 332 @param[in] characteristic
ktownsend 2:ffc5216bd2cc 333 The GattCharacteristic to write to
ktownsend 0:ace2e8d3ce79 334 @param[in] buffer
ktownsend 0:ace2e8d3ce79 335 Data to use when updating the characteristic's value
ktownsend 0:ace2e8d3ce79 336 (raw byte array in LSB format)
ktownsend 0:ace2e8d3ce79 337 @param[in] len
ktownsend 0:ace2e8d3ce79 338 The number of bytes in buffer
ktownsend 7:5e1f0d7f7c7d 339
ktownsend 7:5e1f0d7f7c7d 340 @returns ble_error_t
ktownsend 7:5e1f0d7f7c7d 341
ktownsend 7:5e1f0d7f7c7d 342 @retval BLE_ERROR_NONE
ktownsend 7:5e1f0d7f7c7d 343 Everything executed properly
ktownsend 7:5e1f0d7f7c7d 344
ktownsend 7:5e1f0d7f7c7d 345 @section EXAMPLE
ktownsend 7:5e1f0d7f7c7d 346
ktownsend 7:5e1f0d7f7c7d 347 @code
ktownsend 7:5e1f0d7f7c7d 348
ktownsend 7:5e1f0d7f7c7d 349 @endcode
ktownsend 0:ace2e8d3ce79 350 */
ktownsend 0:ace2e8d3ce79 351 /**************************************************************************/
ktownsend 2:ffc5216bd2cc 352 ble_error_t nRF51822::writeCharacteristic(GattService &service, GattCharacteristic &characteristic, uint8_t buffer[], uint16_t len)
ktownsend 0:ace2e8d3ce79 353 {
ktownsend 0:ace2e8d3ce79 354 /* Command ID = 0x0006, Payload = Service ID, Characteristic ID, Value */
ktownsend 11:200931be5617 355 uart.printf("10 06 00 %02X %02X %02X", len + 2, characteristic.handle, service.handle);
ktownsend 0:ace2e8d3ce79 356 for (uint16_t i = 0; i<len; i++)
ktownsend 0:ace2e8d3ce79 357 {
ktownsend 0:ace2e8d3ce79 358 uart.printf(" %02X", buffer[i]);
ktownsend 0:ace2e8d3ce79 359 }
ktownsend 0:ace2e8d3ce79 360 uart.printf("\r\n");
ktownsend 0:ace2e8d3ce79 361
ktownsend 0:ace2e8d3ce79 362 /* ToDo: Check response */
ktownsend 0:ace2e8d3ce79 363 wait(0.1);
ktownsend 0:ace2e8d3ce79 364
ktownsend 0:ace2e8d3ce79 365 return BLE_ERROR_NONE;
ktownsend 0:ace2e8d3ce79 366 }
ktownsend 0:ace2e8d3ce79 367
ktownsend 0:ace2e8d3ce79 368 /**************************************************************************/
ktownsend 0:ace2e8d3ce79 369 /*!
ktownsend 0:ace2e8d3ce79 370 @brief Starts the BLE HW, initialising any services that were
ktownsend 0:ace2e8d3ce79 371 added before this function was called.
ktownsend 0:ace2e8d3ce79 372
ktownsend 0:ace2e8d3ce79 373 @note All services must be added before calling this function!
ktownsend 7:5e1f0d7f7c7d 374
ktownsend 7:5e1f0d7f7c7d 375 @returns ble_error_t
ktownsend 7:5e1f0d7f7c7d 376
ktownsend 7:5e1f0d7f7c7d 377 @retval BLE_ERROR_NONE
ktownsend 7:5e1f0d7f7c7d 378 Everything executed properly
ktownsend 7:5e1f0d7f7c7d 379
ktownsend 7:5e1f0d7f7c7d 380 @section EXAMPLE
ktownsend 7:5e1f0d7f7c7d 381
ktownsend 7:5e1f0d7f7c7d 382 @code
ktownsend 7:5e1f0d7f7c7d 383
ktownsend 7:5e1f0d7f7c7d 384 @endcode
ktownsend 0:ace2e8d3ce79 385 */
ktownsend 0:ace2e8d3ce79 386 /**************************************************************************/
ktownsend 0:ace2e8d3ce79 387 ble_error_t nRF51822::start(void)
ktownsend 0:ace2e8d3ce79 388 {
ktownsend 0:ace2e8d3ce79 389 /* Command ID = 0x0003, No payload */
ktownsend 0:ace2e8d3ce79 390 uart.printf("10 03 00 00\r\n");
ktownsend 0:ace2e8d3ce79 391
ktownsend 0:ace2e8d3ce79 392 /* ToDo: Check response */
ktownsend 0:ace2e8d3ce79 393 wait(0.5);
ktownsend 0:ace2e8d3ce79 394
ktownsend 0:ace2e8d3ce79 395 return BLE_ERROR_NONE;
ktownsend 0:ace2e8d3ce79 396 }
ktownsend 0:ace2e8d3ce79 397
ktownsend 0:ace2e8d3ce79 398 /**************************************************************************/
ktownsend 0:ace2e8d3ce79 399 /*!
ktownsend 0:ace2e8d3ce79 400 @brief Stops the BLE HW and disconnects from any devices
ktownsend 7:5e1f0d7f7c7d 401
ktownsend 7:5e1f0d7f7c7d 402 @returns ble_error_t
ktownsend 7:5e1f0d7f7c7d 403
ktownsend 7:5e1f0d7f7c7d 404 @retval BLE_ERROR_NONE
ktownsend 7:5e1f0d7f7c7d 405 Everything executed properly
ktownsend 7:5e1f0d7f7c7d 406
ktownsend 7:5e1f0d7f7c7d 407 @section EXAMPLE
ktownsend 7:5e1f0d7f7c7d 408
ktownsend 7:5e1f0d7f7c7d 409 @code
ktownsend 7:5e1f0d7f7c7d 410
ktownsend 7:5e1f0d7f7c7d 411 @endcode
ktownsend 0:ace2e8d3ce79 412 */
ktownsend 0:ace2e8d3ce79 413 /**************************************************************************/
ktownsend 0:ace2e8d3ce79 414 ble_error_t nRF51822::stop(void)
ktownsend 0:ace2e8d3ce79 415 {
ktownsend 0:ace2e8d3ce79 416 /* Command ID = 0x0004, No payload */
ktownsend 0:ace2e8d3ce79 417 uart.printf("10 04 00 00\r\n");
ktownsend 0:ace2e8d3ce79 418
ktownsend 0:ace2e8d3ce79 419 /* ToDo: Check response */
ktownsend 0:ace2e8d3ce79 420 wait(0.1);
ktownsend 0:ace2e8d3ce79 421
ktownsend 0:ace2e8d3ce79 422 return BLE_ERROR_NONE;
ktownsend 0:ace2e8d3ce79 423 }
ktownsend 0:ace2e8d3ce79 424
ktownsend 0:ace2e8d3ce79 425 /**************************************************************************/
ktownsend 0:ace2e8d3ce79 426 /*!
ktownsend 0:ace2e8d3ce79 427 @brief Resets the BLE HW, removing any existing services and
ktownsend 0:ace2e8d3ce79 428 characteristics
ktownsend 7:5e1f0d7f7c7d 429
ktownsend 7:5e1f0d7f7c7d 430 @returns ble_error_t
ktownsend 7:5e1f0d7f7c7d 431
ktownsend 7:5e1f0d7f7c7d 432 @retval BLE_ERROR_NONE
ktownsend 7:5e1f0d7f7c7d 433 Everything executed properly
ktownsend 7:5e1f0d7f7c7d 434
ktownsend 7:5e1f0d7f7c7d 435 @section EXAMPLE
ktownsend 7:5e1f0d7f7c7d 436
ktownsend 7:5e1f0d7f7c7d 437 @code
ktownsend 7:5e1f0d7f7c7d 438
ktownsend 7:5e1f0d7f7c7d 439 @endcode
ktownsend 0:ace2e8d3ce79 440 */
ktownsend 0:ace2e8d3ce79 441 /**************************************************************************/
ktownsend 0:ace2e8d3ce79 442 ble_error_t nRF51822::reset(void)
ktownsend 0:ace2e8d3ce79 443 {
ktownsend 0:ace2e8d3ce79 444 /* Command ID = 0x0005, No payload */
ktownsend 0:ace2e8d3ce79 445 uart.printf("10 05 00 00\r\n");
ktownsend 0:ace2e8d3ce79 446
ktownsend 0:ace2e8d3ce79 447 /* Reset the service counter */
ktownsend 0:ace2e8d3ce79 448 serviceCount = 0;
ktownsend 0:ace2e8d3ce79 449
ktownsend 0:ace2e8d3ce79 450 /* Wait for the radio to come back up */
ktownsend 0:ace2e8d3ce79 451 wait(1);
ktownsend 0:ace2e8d3ce79 452
ktownsend 0:ace2e8d3ce79 453 return BLE_ERROR_NONE;
ktownsend 0:ace2e8d3ce79 454 }