Bill Schilit / BLE_API

Fork of BLE_API by Bluetooth Low Energy

Committer:
ktownsend
Date:
Wed Dec 18 11:52:37 2013 +0000
Revision:
14:6ea5d1012a64
Parent:
13:a585c98b6abc
Child:
15:327d7329072c
Fixed advertising interval checks

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