Bill Schilit / BLE_API

Fork of BLE_API by Bluetooth Low Energy

Committer:
ktownsend
Date:
Wed Dec 11 22:15:59 2013 +0000
Revision:
3:46de446e82ed
Parent:
2:ffc5216bd2cc
Child:
7:5e1f0d7f7c7d
Incremental changes for GAP Advertising API

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 3:46de446e82ed 22
ktownsend 1:fd3ec64b2345 23 //nRF51822::nRF51822() : uart(P0_4, P0_0) /* LPC812 */
ktownsend 1:fd3ec64b2345 24 nRF51822::nRF51822() : uart(p9, p10) /* LPC1768 using apps board */
ktownsend 0:ace2e8d3ce79 25 {
ktownsend 0:ace2e8d3ce79 26 /* Setup the nRF UART interface */
ktownsend 0:ace2e8d3ce79 27 uart.baud(9600);
ktownsend 2:ffc5216bd2cc 28
ktownsend 0:ace2e8d3ce79 29 /* Echo data on the debug CDC port */
ktownsend 0:ace2e8d3ce79 30 uart.attach(this, &nRF51822::uartCallback);
ktownsend 0:ace2e8d3ce79 31
ktownsend 0:ace2e8d3ce79 32 /* Add flow control for UART (required by the nRF51822) */
ktownsend 1:fd3ec64b2345 33 //uart.set_flow_control(Serial::RTSCTS, P0_6, P0_8); /* LPC812 */
ktownsend 1:fd3ec64b2345 34 uart.set_flow_control(Serial::RTSCTS, p30, p29); /* LPC1768 */
ktownsend 2:ffc5216bd2cc 35
ktownsend 0:ace2e8d3ce79 36 /* Reset the service counter */
ktownsend 0:ace2e8d3ce79 37 serviceCount = 0;
ktownsend 0:ace2e8d3ce79 38 }
ktownsend 0:ace2e8d3ce79 39
ktownsend 0:ace2e8d3ce79 40 /**************************************************************************/
ktownsend 0:ace2e8d3ce79 41 /*!
ktownsend 0:ace2e8d3ce79 42 @brief Destructor
ktownsend 0:ace2e8d3ce79 43 */
ktownsend 0:ace2e8d3ce79 44 /**************************************************************************/
ktownsend 0:ace2e8d3ce79 45 nRF51822::~nRF51822(void)
ktownsend 0:ace2e8d3ce79 46 {
ktownsend 0:ace2e8d3ce79 47 }
ktownsend 0:ace2e8d3ce79 48
ktownsend 0:ace2e8d3ce79 49 /**************************************************************************/
ktownsend 0:ace2e8d3ce79 50 /*!
ktownsend 0:ace2e8d3ce79 51
ktownsend 0:ace2e8d3ce79 52 */
ktownsend 0:ace2e8d3ce79 53 /**************************************************************************/
ktownsend 2:ffc5216bd2cc 54 void nRF51822::test(void)
ktownsend 2:ffc5216bd2cc 55 {
ktownsend 2:ffc5216bd2cc 56 /* Send iBeacon data as a test */
ktownsend 2:ffc5216bd2cc 57 uart.printf("10 0a 00 1e 02 01 04 1A FF 4C 00 02 15 E2 0A 39 F4 73 F5 4B C4 A1 2F 17 D1 AD 07 A9 61 00 00 00 00 C8\r\n");
ktownsend 3:46de446e82ed 58 /* ToDo: Check response */
ktownsend 2:ffc5216bd2cc 59 wait(0.1);
ktownsend 3:46de446e82ed 60
ktownsend 2:ffc5216bd2cc 61 /* Start the radio */
ktownsend 2:ffc5216bd2cc 62 uart.printf("10 03 00 00\r\n");
ktownsend 3:46de446e82ed 63 /* ToDo: Check response */
ktownsend 3:46de446e82ed 64 wait(0.1);
ktownsend 2:ffc5216bd2cc 65 }
ktownsend 0:ace2e8d3ce79 66
ktownsend 0:ace2e8d3ce79 67 /**************************************************************************/
ktownsend 0:ace2e8d3ce79 68 /*!
ktownsend 0:ace2e8d3ce79 69
ktownsend 0:ace2e8d3ce79 70 */
ktownsend 0:ace2e8d3ce79 71 /**************************************************************************/
ktownsend 2:ffc5216bd2cc 72 ble_error_t nRF51822::setAdvertising(GapAdvertisingParams &, GapAdvertisingData &)
ktownsend 2:ffc5216bd2cc 73 {
ktownsend 2:ffc5216bd2cc 74 return BLE_ERROR_NONE;
ktownsend 2:ffc5216bd2cc 75 }
ktownsend 2:ffc5216bd2cc 76
ktownsend 2:ffc5216bd2cc 77 /**************************************************************************/
ktownsend 2:ffc5216bd2cc 78 /*!
ktownsend 2:ffc5216bd2cc 79
ktownsend 2:ffc5216bd2cc 80 */
ktownsend 2:ffc5216bd2cc 81 /**************************************************************************/
ktownsend 2:ffc5216bd2cc 82 ble_error_t nRF51822::addService(GattService & service)
ktownsend 0:ace2e8d3ce79 83 {
ktownsend 0:ace2e8d3ce79 84 /* ToDo: Make sure we don't overflow the array, etc. */
ktownsend 0:ace2e8d3ce79 85 /* ToDo: Make sure this service UUID doesn't already exist (?) */
ktownsend 0:ace2e8d3ce79 86 /* ToDo: Basic validation */
ktownsend 0:ace2e8d3ce79 87
ktownsend 0:ace2e8d3ce79 88 /* Add the service to the nRF51 */
ktownsend 0:ace2e8d3ce79 89 if (service.primaryServiceID.type == UUID::UUID_TYPE_SHORT)
ktownsend 0:ace2e8d3ce79 90 {
ktownsend 0:ace2e8d3ce79 91 /* 16-bit BLE UUID */
ktownsend 0:ace2e8d3ce79 92 uart.printf("10 01 00 04 01 02 %02X %02X\r\n",
ktownsend 0:ace2e8d3ce79 93 service.primaryServiceID.value & 0xFF,
ktownsend 0:ace2e8d3ce79 94 service.primaryServiceID.value >> 8);
ktownsend 0:ace2e8d3ce79 95 }
ktownsend 0:ace2e8d3ce79 96 else
ktownsend 0:ace2e8d3ce79 97 {
ktownsend 0:ace2e8d3ce79 98 /* 128-bit Custom UUID */
ktownsend 0:ace2e8d3ce79 99 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 100 service.primaryServiceID.base[0],
ktownsend 0:ace2e8d3ce79 101 service.primaryServiceID.base[1],
ktownsend 0:ace2e8d3ce79 102 service.primaryServiceID.base[2],
ktownsend 0:ace2e8d3ce79 103 service.primaryServiceID.base[3],
ktownsend 0:ace2e8d3ce79 104 service.primaryServiceID.base[4],
ktownsend 0:ace2e8d3ce79 105 service.primaryServiceID.base[5],
ktownsend 0:ace2e8d3ce79 106 service.primaryServiceID.base[6],
ktownsend 0:ace2e8d3ce79 107 service.primaryServiceID.base[7],
ktownsend 0:ace2e8d3ce79 108 service.primaryServiceID.base[8],
ktownsend 0:ace2e8d3ce79 109 service.primaryServiceID.base[9],
ktownsend 0:ace2e8d3ce79 110 service.primaryServiceID.base[10],
ktownsend 0:ace2e8d3ce79 111 service.primaryServiceID.base[11],
ktownsend 0:ace2e8d3ce79 112 service.primaryServiceID.base[12],
ktownsend 0:ace2e8d3ce79 113 service.primaryServiceID.base[13],
ktownsend 0:ace2e8d3ce79 114 service.primaryServiceID.base[14],
ktownsend 0:ace2e8d3ce79 115 service.primaryServiceID.base[15]);
ktownsend 0:ace2e8d3ce79 116 }
ktownsend 0:ace2e8d3ce79 117
ktownsend 0:ace2e8d3ce79 118 /* ToDo: Check response */
ktownsend 0:ace2e8d3ce79 119 wait(0.1);
ktownsend 0:ace2e8d3ce79 120
ktownsend 0:ace2e8d3ce79 121 /* Add characteristics to the service */
ktownsend 0:ace2e8d3ce79 122 for (uint8_t i = 0; i < service.characteristicCount; i++)
ktownsend 0:ace2e8d3ce79 123 {
ktownsend 0:ace2e8d3ce79 124 /* Command ID = 0x0002 */
ktownsend 0:ace2e8d3ce79 125 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 126 service.characteristics[i].id & 0xFF,
ktownsend 0:ace2e8d3ce79 127 service.characteristics[i].id >> 8,
ktownsend 0:ace2e8d3ce79 128 service.characteristics[i].lenMin & 0xFF,
ktownsend 0:ace2e8d3ce79 129 service.characteristics[i].lenMin >> 8,
ktownsend 0:ace2e8d3ce79 130 service.characteristics[i].lenMax & 0xFF,
ktownsend 0:ace2e8d3ce79 131 service.characteristics[i].lenMax >> 8,
ktownsend 0:ace2e8d3ce79 132 service.characteristics[i].properties);
ktownsend 0:ace2e8d3ce79 133
ktownsend 0:ace2e8d3ce79 134 /* ToDo: Check response */
ktownsend 0:ace2e8d3ce79 135 wait(0.1);
ktownsend 0:ace2e8d3ce79 136 }
ktownsend 0:ace2e8d3ce79 137
ktownsend 0:ace2e8d3ce79 138 /* Update the service index value */
ktownsend 0:ace2e8d3ce79 139 service.index = serviceCount;
ktownsend 0:ace2e8d3ce79 140 serviceCount++;
ktownsend 0:ace2e8d3ce79 141
ktownsend 0:ace2e8d3ce79 142 return BLE_ERROR_NONE;
ktownsend 0:ace2e8d3ce79 143 }
ktownsend 0:ace2e8d3ce79 144
ktownsend 0:ace2e8d3ce79 145 /**************************************************************************/
ktownsend 0:ace2e8d3ce79 146 /*!
ktownsend 2:ffc5216bd2cc 147 @brief Reads the value of a characteristic, based on the service
ktownsend 2:ffc5216bd2cc 148 and characteristic index fields
ktownsend 2:ffc5216bd2cc 149
ktownsend 2:ffc5216bd2cc 150 @param[in] service
ktownsend 2:ffc5216bd2cc 151 The GattService to read from
ktownsend 2:ffc5216bd2cc 152 @param[in] characteristic
ktownsend 2:ffc5216bd2cc 153 The GattCharacteristic to read from
ktownsend 2:ffc5216bd2cc 154 @param[in] buffer
ktownsend 2:ffc5216bd2cc 155 Buffer to hold the the characteristic's value
ktownsend 2:ffc5216bd2cc 156 (raw byte array in LSB format)
ktownsend 2:ffc5216bd2cc 157 @param[in] len
ktownsend 2:ffc5216bd2cc 158 The number of bytes read into the buffer
ktownsend 2:ffc5216bd2cc 159 */
ktownsend 2:ffc5216bd2cc 160 /**************************************************************************/
ktownsend 2:ffc5216bd2cc 161 ble_error_t nRF51822::readCharacteristic(GattService &service, GattCharacteristic &characteristic, uint8_t buffer[], uint16_t len)
ktownsend 2:ffc5216bd2cc 162 {
ktownsend 2:ffc5216bd2cc 163 /* ToDo */
ktownsend 2:ffc5216bd2cc 164
ktownsend 2:ffc5216bd2cc 165 return BLE_ERROR_NONE;
ktownsend 2:ffc5216bd2cc 166 }
ktownsend 2:ffc5216bd2cc 167
ktownsend 2:ffc5216bd2cc 168 /**************************************************************************/
ktownsend 2:ffc5216bd2cc 169 /*!
ktownsend 0:ace2e8d3ce79 170 @brief Updates the value of a characteristic, based on the service
ktownsend 0:ace2e8d3ce79 171 and characteristic index fields
ktownsend 0:ace2e8d3ce79 172
ktownsend 2:ffc5216bd2cc 173 @param[in] service
ktownsend 2:ffc5216bd2cc 174 The GattService to write to
ktownsend 2:ffc5216bd2cc 175 @param[in] characteristic
ktownsend 2:ffc5216bd2cc 176 The GattCharacteristic to write to
ktownsend 0:ace2e8d3ce79 177 @param[in] buffer
ktownsend 0:ace2e8d3ce79 178 Data to use when updating the characteristic's value
ktownsend 0:ace2e8d3ce79 179 (raw byte array in LSB format)
ktownsend 0:ace2e8d3ce79 180 @param[in] len
ktownsend 0:ace2e8d3ce79 181 The number of bytes in buffer
ktownsend 0:ace2e8d3ce79 182 */
ktownsend 0:ace2e8d3ce79 183 /**************************************************************************/
ktownsend 2:ffc5216bd2cc 184 ble_error_t nRF51822::writeCharacteristic(GattService &service, GattCharacteristic &characteristic, uint8_t buffer[], uint16_t len)
ktownsend 0:ace2e8d3ce79 185 {
ktownsend 0:ace2e8d3ce79 186 /* Command ID = 0x0006, Payload = Service ID, Characteristic ID, Value */
ktownsend 2:ffc5216bd2cc 187 uart.printf("10 06 00 %02X %02X %02X", len + 2, characteristic.index, service.index);
ktownsend 0:ace2e8d3ce79 188 for (uint16_t i = 0; i<len; i++)
ktownsend 0:ace2e8d3ce79 189 {
ktownsend 0:ace2e8d3ce79 190 uart.printf(" %02X", buffer[i]);
ktownsend 0:ace2e8d3ce79 191 }
ktownsend 0:ace2e8d3ce79 192 uart.printf("\r\n");
ktownsend 0:ace2e8d3ce79 193
ktownsend 0:ace2e8d3ce79 194 /* ToDo: Check response */
ktownsend 0:ace2e8d3ce79 195 wait(0.1);
ktownsend 0:ace2e8d3ce79 196
ktownsend 0:ace2e8d3ce79 197 return BLE_ERROR_NONE;
ktownsend 0:ace2e8d3ce79 198 }
ktownsend 0:ace2e8d3ce79 199
ktownsend 0:ace2e8d3ce79 200 /**************************************************************************/
ktownsend 0:ace2e8d3ce79 201 /*!
ktownsend 0:ace2e8d3ce79 202 @brief Starts the BLE HW, initialising any services that were
ktownsend 0:ace2e8d3ce79 203 added before this function was called.
ktownsend 0:ace2e8d3ce79 204
ktownsend 0:ace2e8d3ce79 205 @note All services must be added before calling this function!
ktownsend 0:ace2e8d3ce79 206 */
ktownsend 0:ace2e8d3ce79 207 /**************************************************************************/
ktownsend 0:ace2e8d3ce79 208 ble_error_t nRF51822::start(void)
ktownsend 0:ace2e8d3ce79 209 {
ktownsend 0:ace2e8d3ce79 210 /* Command ID = 0x0003, No payload */
ktownsend 0:ace2e8d3ce79 211 uart.printf("10 03 00 00\r\n");
ktownsend 0:ace2e8d3ce79 212
ktownsend 0:ace2e8d3ce79 213 /* ToDo: Check response */
ktownsend 0:ace2e8d3ce79 214 wait(0.5);
ktownsend 0:ace2e8d3ce79 215
ktownsend 0:ace2e8d3ce79 216 return BLE_ERROR_NONE;
ktownsend 0:ace2e8d3ce79 217 }
ktownsend 0:ace2e8d3ce79 218
ktownsend 0:ace2e8d3ce79 219 /**************************************************************************/
ktownsend 0:ace2e8d3ce79 220 /*!
ktownsend 0:ace2e8d3ce79 221 @brief Stops the BLE HW and disconnects from any devices
ktownsend 0:ace2e8d3ce79 222 */
ktownsend 0:ace2e8d3ce79 223 /**************************************************************************/
ktownsend 0:ace2e8d3ce79 224 ble_error_t nRF51822::stop(void)
ktownsend 0:ace2e8d3ce79 225 {
ktownsend 0:ace2e8d3ce79 226 /* Command ID = 0x0004, No payload */
ktownsend 0:ace2e8d3ce79 227 uart.printf("10 04 00 00\r\n");
ktownsend 0:ace2e8d3ce79 228
ktownsend 0:ace2e8d3ce79 229 /* ToDo: Check response */
ktownsend 0:ace2e8d3ce79 230 wait(0.1);
ktownsend 0:ace2e8d3ce79 231
ktownsend 0:ace2e8d3ce79 232 return BLE_ERROR_NONE;
ktownsend 0:ace2e8d3ce79 233 }
ktownsend 0:ace2e8d3ce79 234
ktownsend 0:ace2e8d3ce79 235 /**************************************************************************/
ktownsend 0:ace2e8d3ce79 236 /*!
ktownsend 0:ace2e8d3ce79 237 @brief Resets the BLE HW, removing any existing services and
ktownsend 0:ace2e8d3ce79 238 characteristics
ktownsend 0:ace2e8d3ce79 239 */
ktownsend 0:ace2e8d3ce79 240 /**************************************************************************/
ktownsend 0:ace2e8d3ce79 241 ble_error_t nRF51822::reset(void)
ktownsend 0:ace2e8d3ce79 242 {
ktownsend 0:ace2e8d3ce79 243 /* Command ID = 0x0005, No payload */
ktownsend 0:ace2e8d3ce79 244 uart.printf("10 05 00 00\r\n");
ktownsend 0:ace2e8d3ce79 245
ktownsend 0:ace2e8d3ce79 246 /* Reset the service counter */
ktownsend 0:ace2e8d3ce79 247 serviceCount = 0;
ktownsend 0:ace2e8d3ce79 248
ktownsend 0:ace2e8d3ce79 249 /* Wait for the radio to come back up */
ktownsend 0:ace2e8d3ce79 250 wait(1);
ktownsend 0:ace2e8d3ce79 251
ktownsend 0:ace2e8d3ce79 252 return BLE_ERROR_NONE;
ktownsend 0:ace2e8d3ce79 253 }