High level Bluetooth Low Energy API and radio abstraction layer

Dependencies:   nRF51822

Dependents:   LinkNode_LIS3DH

Fork of BLE_API by Bluetooth Low Energy

Committer:
ktownsend
Date:
Tue Dec 17 17:28:41 2013 +0000
Revision:
11:200931be5617
Parent:
10:f905b036bb07
Child:
12:2c6b1059ed36
Added debug info to nrf51822.cpp

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