Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Fork of BLE_API by
hw/nrf51822.cpp@7:5e1f0d7f7c7d, 2013-12-16 (annotated)
- Committer:
- ktownsend
- Date:
- Mon Dec 16 12:46:12 2013 +0000
- Revision:
- 7:5e1f0d7f7c7d
- Parent:
- 3:46de446e82ed
- Child:
- 9:124ae067ae27
More GAP cleanup (Scan Response, etc.)
Who changed what in which revision?
| User | Revision | Line number | New 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 | 1:fd3ec64b2345 | 22 | nRF51822::nRF51822() : uart(p9, p10) /* LPC1768 using apps board */ |
| 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 | 1:fd3ec64b2345 | 31 | uart.set_flow_control(Serial::RTSCTS, p30, p29); /* LPC1768 */ |
| 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 | 0:ace2e8d3ce79 | 48 | |
| ktownsend | 0:ace2e8d3ce79 | 49 | */ |
| ktownsend | 0:ace2e8d3ce79 | 50 | /**************************************************************************/ |
| ktownsend | 2:ffc5216bd2cc | 51 | void nRF51822::test(void) |
| ktownsend | 2:ffc5216bd2cc | 52 | { |
| ktownsend | 2:ffc5216bd2cc | 53 | /* Send iBeacon data as a test */ |
| ktownsend | 2:ffc5216bd2cc | 54 | 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 | 55 | /* ToDo: Check response */ |
| ktownsend | 2:ffc5216bd2cc | 56 | wait(0.1); |
| ktownsend | 3:46de446e82ed | 57 | |
| ktownsend | 2:ffc5216bd2cc | 58 | /* Start the radio */ |
| ktownsend | 2:ffc5216bd2cc | 59 | uart.printf("10 03 00 00\r\n"); |
| ktownsend | 3:46de446e82ed | 60 | /* ToDo: Check response */ |
| ktownsend | 3:46de446e82ed | 61 | wait(0.1); |
| ktownsend | 2:ffc5216bd2cc | 62 | } |
| ktownsend | 0:ace2e8d3ce79 | 63 | |
| ktownsend | 0:ace2e8d3ce79 | 64 | /**************************************************************************/ |
| ktownsend | 0:ace2e8d3ce79 | 65 | /*! |
| ktownsend | 7:5e1f0d7f7c7d | 66 | @brief Sets the advertising parameters and payload for the device |
| ktownsend | 0:ace2e8d3ce79 | 67 | |
| ktownsend | 7:5e1f0d7f7c7d | 68 | @param[in] params |
| ktownsend | 7:5e1f0d7f7c7d | 69 | Basic advertising details, including the advertising |
| ktownsend | 7:5e1f0d7f7c7d | 70 | delay, timeout and how the device should be advertised |
| ktownsend | 7:5e1f0d7f7c7d | 71 | @params[in] advData |
| ktownsend | 7:5e1f0d7f7c7d | 72 | The primary advertising data payload |
| ktownsend | 7:5e1f0d7f7c7d | 73 | @params[in] scanResponse |
| ktownsend | 7:5e1f0d7f7c7d | 74 | The optional Scan Response payload if the advertising |
| ktownsend | 7:5e1f0d7f7c7d | 75 | type is set to \ref GapAdvertisingParams::ADV_SCANNABLE_UNDIRECTED |
| ktownsend | 7:5e1f0d7f7c7d | 76 | in \ref GapAdveritinngParams |
| ktownsend | 7:5e1f0d7f7c7d | 77 | |
| ktownsend | 7:5e1f0d7f7c7d | 78 | @returns ble_error_t |
| ktownsend | 7:5e1f0d7f7c7d | 79 | |
| ktownsend | 7:5e1f0d7f7c7d | 80 | @retval BLE_ERROR_NONE |
| ktownsend | 7:5e1f0d7f7c7d | 81 | Everything executed properly |
| ktownsend | 7:5e1f0d7f7c7d | 82 | |
| ktownsend | 7:5e1f0d7f7c7d | 83 | @retval BLE_ERROR_BUFFER_OVERFLOW |
| ktownsend | 7:5e1f0d7f7c7d | 84 | The proposed action would cause a buffer overflow. All |
| ktownsend | 7:5e1f0d7f7c7d | 85 | advertising payloads must be <= 31 bytes. |
| ktownsend | 7:5e1f0d7f7c7d | 86 | |
| ktownsend | 7:5e1f0d7f7c7d | 87 | @section EXAMPLE |
| ktownsend | 7:5e1f0d7f7c7d | 88 | |
| ktownsend | 7:5e1f0d7f7c7d | 89 | @code |
| ktownsend | 7:5e1f0d7f7c7d | 90 | |
| ktownsend | 7:5e1f0d7f7c7d | 91 | @endcode |
| ktownsend | 0:ace2e8d3ce79 | 92 | */ |
| ktownsend | 0:ace2e8d3ce79 | 93 | /**************************************************************************/ |
| ktownsend | 7:5e1f0d7f7c7d | 94 | ble_error_t nRF51822::setAdvertising(GapAdvertisingParams & params, GapAdvertisingData & advData, GapAdvertisingData & scanResponse) |
| ktownsend | 2:ffc5216bd2cc | 95 | { |
| ktownsend | 7:5e1f0d7f7c7d | 96 | uint8_t len = 0; |
| ktownsend | 7:5e1f0d7f7c7d | 97 | uint8_t *buffer; |
| ktownsend | 7:5e1f0d7f7c7d | 98 | |
| ktownsend | 7:5e1f0d7f7c7d | 99 | /* ToDo: Send advertising params, Command ID = 0x000x */ |
| ktownsend | 7:5e1f0d7f7c7d | 100 | |
| ktownsend | 7:5e1f0d7f7c7d | 101 | /* Send advertising data, Command ID = 0x000A */ |
| ktownsend | 7:5e1f0d7f7c7d | 102 | len = advData.getPayloadLen(); |
| ktownsend | 7:5e1f0d7f7c7d | 103 | buffer = advData.getPayload(); |
| ktownsend | 7:5e1f0d7f7c7d | 104 | |
| ktownsend | 7:5e1f0d7f7c7d | 105 | if (len > GAP_ADVERTISING_DATA_MAX_PAYLOAD) |
| ktownsend | 7:5e1f0d7f7c7d | 106 | { |
| ktownsend | 7:5e1f0d7f7c7d | 107 | return BLE_ERROR_BUFFER_OVERFLOW; |
| ktownsend | 7:5e1f0d7f7c7d | 108 | } |
| ktownsend | 7:5e1f0d7f7c7d | 109 | |
| ktownsend | 7:5e1f0d7f7c7d | 110 | uart.printf("10 0A 00 %02X ", len); |
| ktownsend | 7:5e1f0d7f7c7d | 111 | for (uint16_t i = 0; i < len; i++) |
| ktownsend | 7:5e1f0d7f7c7d | 112 | { |
| ktownsend | 7:5e1f0d7f7c7d | 113 | uart.printf(" %02X", buffer[i]); |
| ktownsend | 7:5e1f0d7f7c7d | 114 | } |
| ktownsend | 7:5e1f0d7f7c7d | 115 | uart.printf("\r\n"); |
| ktownsend | 7:5e1f0d7f7c7d | 116 | |
| ktownsend | 7:5e1f0d7f7c7d | 117 | /* ToDo: Check response */ |
| ktownsend | 7:5e1f0d7f7c7d | 118 | wait(0.1); |
| ktownsend | 7:5e1f0d7f7c7d | 119 | |
| ktownsend | 7:5e1f0d7f7c7d | 120 | /* Send scan response data, Command ID = 0x000x */ |
| ktownsend | 7:5e1f0d7f7c7d | 121 | if ((params.getAdvertisingType() == GapAdvertisingParams::ADV_SCANNABLE_UNDIRECTED)) |
| ktownsend | 7:5e1f0d7f7c7d | 122 | { |
| ktownsend | 7:5e1f0d7f7c7d | 123 | len = advData.getPayloadLen(); |
| ktownsend | 7:5e1f0d7f7c7d | 124 | buffer = advData.getPayload(); |
| ktownsend | 7:5e1f0d7f7c7d | 125 | |
| ktownsend | 7:5e1f0d7f7c7d | 126 | if (len > GAP_ADVERTISING_DATA_MAX_PAYLOAD) |
| ktownsend | 7:5e1f0d7f7c7d | 127 | { |
| ktownsend | 7:5e1f0d7f7c7d | 128 | return BLE_ERROR_BUFFER_OVERFLOW; |
| ktownsend | 7:5e1f0d7f7c7d | 129 | } |
| ktownsend | 7:5e1f0d7f7c7d | 130 | |
| ktownsend | 7:5e1f0d7f7c7d | 131 | uart.printf("10 0A 00 %02X ", len); |
| ktownsend | 7:5e1f0d7f7c7d | 132 | for (uint16_t i = 0; i < len; i++) |
| ktownsend | 7:5e1f0d7f7c7d | 133 | { |
| ktownsend | 7:5e1f0d7f7c7d | 134 | uart.printf(" %02X", buffer[i]); |
| ktownsend | 7:5e1f0d7f7c7d | 135 | } |
| ktownsend | 7:5e1f0d7f7c7d | 136 | uart.printf("\r\n"); |
| ktownsend | 7:5e1f0d7f7c7d | 137 | |
| ktownsend | 7:5e1f0d7f7c7d | 138 | /* ToDo: Check response */ |
| ktownsend | 7:5e1f0d7f7c7d | 139 | wait(0.1); |
| ktownsend | 7:5e1f0d7f7c7d | 140 | } |
| ktownsend | 7:5e1f0d7f7c7d | 141 | |
| ktownsend | 2:ffc5216bd2cc | 142 | return BLE_ERROR_NONE; |
| ktownsend | 2:ffc5216bd2cc | 143 | } |
| ktownsend | 2:ffc5216bd2cc | 144 | |
| ktownsend | 2:ffc5216bd2cc | 145 | /**************************************************************************/ |
| ktownsend | 2:ffc5216bd2cc | 146 | /*! |
| ktownsend | 7:5e1f0d7f7c7d | 147 | @brief Adds a new service to the GATT table on the peripheral |
| ktownsend | 7:5e1f0d7f7c7d | 148 | |
| ktownsend | 7:5e1f0d7f7c7d | 149 | @returns ble_error_t |
| ktownsend | 7:5e1f0d7f7c7d | 150 | |
| ktownsend | 7:5e1f0d7f7c7d | 151 | @retval BLE_ERROR_NONE |
| ktownsend | 7:5e1f0d7f7c7d | 152 | Everything executed properly |
| ktownsend | 7:5e1f0d7f7c7d | 153 | |
| ktownsend | 7:5e1f0d7f7c7d | 154 | @section EXAMPLE |
| ktownsend | 2:ffc5216bd2cc | 155 | |
| ktownsend | 7:5e1f0d7f7c7d | 156 | @code |
| ktownsend | 7:5e1f0d7f7c7d | 157 | |
| ktownsend | 7:5e1f0d7f7c7d | 158 | @endcode |
| ktownsend | 2:ffc5216bd2cc | 159 | */ |
| ktownsend | 2:ffc5216bd2cc | 160 | /**************************************************************************/ |
| ktownsend | 2:ffc5216bd2cc | 161 | ble_error_t nRF51822::addService(GattService & service) |
| ktownsend | 0:ace2e8d3ce79 | 162 | { |
| ktownsend | 0:ace2e8d3ce79 | 163 | /* ToDo: Make sure we don't overflow the array, etc. */ |
| ktownsend | 0:ace2e8d3ce79 | 164 | /* ToDo: Make sure this service UUID doesn't already exist (?) */ |
| ktownsend | 0:ace2e8d3ce79 | 165 | /* ToDo: Basic validation */ |
| ktownsend | 0:ace2e8d3ce79 | 166 | |
| ktownsend | 0:ace2e8d3ce79 | 167 | /* Add the service to the nRF51 */ |
| ktownsend | 0:ace2e8d3ce79 | 168 | if (service.primaryServiceID.type == UUID::UUID_TYPE_SHORT) |
| ktownsend | 0:ace2e8d3ce79 | 169 | { |
| ktownsend | 0:ace2e8d3ce79 | 170 | /* 16-bit BLE UUID */ |
| ktownsend | 0:ace2e8d3ce79 | 171 | uart.printf("10 01 00 04 01 02 %02X %02X\r\n", |
| ktownsend | 0:ace2e8d3ce79 | 172 | service.primaryServiceID.value & 0xFF, |
| ktownsend | 0:ace2e8d3ce79 | 173 | service.primaryServiceID.value >> 8); |
| ktownsend | 0:ace2e8d3ce79 | 174 | } |
| ktownsend | 0:ace2e8d3ce79 | 175 | else |
| ktownsend | 0:ace2e8d3ce79 | 176 | { |
| ktownsend | 0:ace2e8d3ce79 | 177 | /* 128-bit Custom UUID */ |
| ktownsend | 0:ace2e8d3ce79 | 178 | 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 | 179 | service.primaryServiceID.base[0], |
| ktownsend | 0:ace2e8d3ce79 | 180 | service.primaryServiceID.base[1], |
| ktownsend | 0:ace2e8d3ce79 | 181 | service.primaryServiceID.base[2], |
| ktownsend | 0:ace2e8d3ce79 | 182 | service.primaryServiceID.base[3], |
| ktownsend | 0:ace2e8d3ce79 | 183 | service.primaryServiceID.base[4], |
| ktownsend | 0:ace2e8d3ce79 | 184 | service.primaryServiceID.base[5], |
| ktownsend | 0:ace2e8d3ce79 | 185 | service.primaryServiceID.base[6], |
| ktownsend | 0:ace2e8d3ce79 | 186 | service.primaryServiceID.base[7], |
| ktownsend | 0:ace2e8d3ce79 | 187 | service.primaryServiceID.base[8], |
| ktownsend | 0:ace2e8d3ce79 | 188 | service.primaryServiceID.base[9], |
| ktownsend | 0:ace2e8d3ce79 | 189 | service.primaryServiceID.base[10], |
| ktownsend | 0:ace2e8d3ce79 | 190 | service.primaryServiceID.base[11], |
| ktownsend | 0:ace2e8d3ce79 | 191 | service.primaryServiceID.base[12], |
| ktownsend | 0:ace2e8d3ce79 | 192 | service.primaryServiceID.base[13], |
| ktownsend | 0:ace2e8d3ce79 | 193 | service.primaryServiceID.base[14], |
| ktownsend | 0:ace2e8d3ce79 | 194 | service.primaryServiceID.base[15]); |
| ktownsend | 0:ace2e8d3ce79 | 195 | } |
| ktownsend | 0:ace2e8d3ce79 | 196 | |
| ktownsend | 0:ace2e8d3ce79 | 197 | /* ToDo: Check response */ |
| ktownsend | 0:ace2e8d3ce79 | 198 | wait(0.1); |
| ktownsend | 0:ace2e8d3ce79 | 199 | |
| ktownsend | 0:ace2e8d3ce79 | 200 | /* Add characteristics to the service */ |
| ktownsend | 0:ace2e8d3ce79 | 201 | for (uint8_t i = 0; i < service.characteristicCount; i++) |
| ktownsend | 0:ace2e8d3ce79 | 202 | { |
| ktownsend | 0:ace2e8d3ce79 | 203 | /* Command ID = 0x0002 */ |
| ktownsend | 0:ace2e8d3ce79 | 204 | 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 | 205 | service.characteristics[i].id & 0xFF, |
| ktownsend | 0:ace2e8d3ce79 | 206 | service.characteristics[i].id >> 8, |
| ktownsend | 0:ace2e8d3ce79 | 207 | service.characteristics[i].lenMin & 0xFF, |
| ktownsend | 0:ace2e8d3ce79 | 208 | service.characteristics[i].lenMin >> 8, |
| ktownsend | 0:ace2e8d3ce79 | 209 | service.characteristics[i].lenMax & 0xFF, |
| ktownsend | 0:ace2e8d3ce79 | 210 | service.characteristics[i].lenMax >> 8, |
| ktownsend | 0:ace2e8d3ce79 | 211 | service.characteristics[i].properties); |
| ktownsend | 0:ace2e8d3ce79 | 212 | |
| ktownsend | 0:ace2e8d3ce79 | 213 | /* ToDo: Check response */ |
| ktownsend | 0:ace2e8d3ce79 | 214 | wait(0.1); |
| ktownsend | 0:ace2e8d3ce79 | 215 | } |
| ktownsend | 0:ace2e8d3ce79 | 216 | |
| ktownsend | 0:ace2e8d3ce79 | 217 | /* Update the service index value */ |
| ktownsend | 0:ace2e8d3ce79 | 218 | service.index = serviceCount; |
| ktownsend | 0:ace2e8d3ce79 | 219 | serviceCount++; |
| ktownsend | 0:ace2e8d3ce79 | 220 | |
| ktownsend | 0:ace2e8d3ce79 | 221 | return BLE_ERROR_NONE; |
| ktownsend | 0:ace2e8d3ce79 | 222 | } |
| ktownsend | 0:ace2e8d3ce79 | 223 | |
| ktownsend | 0:ace2e8d3ce79 | 224 | /**************************************************************************/ |
| ktownsend | 0:ace2e8d3ce79 | 225 | /*! |
| ktownsend | 2:ffc5216bd2cc | 226 | @brief Reads the value of a characteristic, based on the service |
| ktownsend | 2:ffc5216bd2cc | 227 | and characteristic index fields |
| ktownsend | 2:ffc5216bd2cc | 228 | |
| ktownsend | 2:ffc5216bd2cc | 229 | @param[in] service |
| ktownsend | 2:ffc5216bd2cc | 230 | The GattService to read from |
| ktownsend | 2:ffc5216bd2cc | 231 | @param[in] characteristic |
| ktownsend | 2:ffc5216bd2cc | 232 | The GattCharacteristic to read from |
| ktownsend | 2:ffc5216bd2cc | 233 | @param[in] buffer |
| ktownsend | 2:ffc5216bd2cc | 234 | Buffer to hold the the characteristic's value |
| ktownsend | 2:ffc5216bd2cc | 235 | (raw byte array in LSB format) |
| ktownsend | 2:ffc5216bd2cc | 236 | @param[in] len |
| ktownsend | 2:ffc5216bd2cc | 237 | The number of bytes read into the buffer |
| ktownsend | 7:5e1f0d7f7c7d | 238 | |
| ktownsend | 7:5e1f0d7f7c7d | 239 | @returns ble_error_t |
| ktownsend | 7:5e1f0d7f7c7d | 240 | |
| ktownsend | 7:5e1f0d7f7c7d | 241 | @retval BLE_ERROR_NONE |
| ktownsend | 7:5e1f0d7f7c7d | 242 | Everything executed properly |
| ktownsend | 7:5e1f0d7f7c7d | 243 | |
| ktownsend | 7:5e1f0d7f7c7d | 244 | @section EXAMPLE |
| ktownsend | 7:5e1f0d7f7c7d | 245 | |
| ktownsend | 7:5e1f0d7f7c7d | 246 | @code |
| ktownsend | 7:5e1f0d7f7c7d | 247 | |
| ktownsend | 7:5e1f0d7f7c7d | 248 | @endcode |
| ktownsend | 2:ffc5216bd2cc | 249 | */ |
| ktownsend | 2:ffc5216bd2cc | 250 | /**************************************************************************/ |
| ktownsend | 2:ffc5216bd2cc | 251 | ble_error_t nRF51822::readCharacteristic(GattService &service, GattCharacteristic &characteristic, uint8_t buffer[], uint16_t len) |
| ktownsend | 2:ffc5216bd2cc | 252 | { |
| ktownsend | 2:ffc5216bd2cc | 253 | /* ToDo */ |
| ktownsend | 2:ffc5216bd2cc | 254 | |
| ktownsend | 2:ffc5216bd2cc | 255 | return BLE_ERROR_NONE; |
| ktownsend | 2:ffc5216bd2cc | 256 | } |
| ktownsend | 2:ffc5216bd2cc | 257 | |
| ktownsend | 2:ffc5216bd2cc | 258 | /**************************************************************************/ |
| ktownsend | 2:ffc5216bd2cc | 259 | /*! |
| ktownsend | 0:ace2e8d3ce79 | 260 | @brief Updates the value of a characteristic, based on the service |
| ktownsend | 0:ace2e8d3ce79 | 261 | and characteristic index fields |
| ktownsend | 0:ace2e8d3ce79 | 262 | |
| ktownsend | 2:ffc5216bd2cc | 263 | @param[in] service |
| ktownsend | 2:ffc5216bd2cc | 264 | The GattService to write to |
| ktownsend | 2:ffc5216bd2cc | 265 | @param[in] characteristic |
| ktownsend | 2:ffc5216bd2cc | 266 | The GattCharacteristic to write to |
| ktownsend | 0:ace2e8d3ce79 | 267 | @param[in] buffer |
| ktownsend | 0:ace2e8d3ce79 | 268 | Data to use when updating the characteristic's value |
| ktownsend | 0:ace2e8d3ce79 | 269 | (raw byte array in LSB format) |
| ktownsend | 0:ace2e8d3ce79 | 270 | @param[in] len |
| ktownsend | 0:ace2e8d3ce79 | 271 | The number of bytes in buffer |
| ktownsend | 7:5e1f0d7f7c7d | 272 | |
| ktownsend | 7:5e1f0d7f7c7d | 273 | @returns ble_error_t |
| ktownsend | 7:5e1f0d7f7c7d | 274 | |
| ktownsend | 7:5e1f0d7f7c7d | 275 | @retval BLE_ERROR_NONE |
| ktownsend | 7:5e1f0d7f7c7d | 276 | Everything executed properly |
| ktownsend | 7:5e1f0d7f7c7d | 277 | |
| ktownsend | 7:5e1f0d7f7c7d | 278 | @section EXAMPLE |
| ktownsend | 7:5e1f0d7f7c7d | 279 | |
| ktownsend | 7:5e1f0d7f7c7d | 280 | @code |
| ktownsend | 7:5e1f0d7f7c7d | 281 | |
| ktownsend | 7:5e1f0d7f7c7d | 282 | @endcode |
| ktownsend | 0:ace2e8d3ce79 | 283 | */ |
| ktownsend | 0:ace2e8d3ce79 | 284 | /**************************************************************************/ |
| ktownsend | 2:ffc5216bd2cc | 285 | ble_error_t nRF51822::writeCharacteristic(GattService &service, GattCharacteristic &characteristic, uint8_t buffer[], uint16_t len) |
| ktownsend | 0:ace2e8d3ce79 | 286 | { |
| ktownsend | 0:ace2e8d3ce79 | 287 | /* Command ID = 0x0006, Payload = Service ID, Characteristic ID, Value */ |
| ktownsend | 2:ffc5216bd2cc | 288 | uart.printf("10 06 00 %02X %02X %02X", len + 2, characteristic.index, service.index); |
| ktownsend | 0:ace2e8d3ce79 | 289 | for (uint16_t i = 0; i<len; i++) |
| ktownsend | 0:ace2e8d3ce79 | 290 | { |
| ktownsend | 0:ace2e8d3ce79 | 291 | uart.printf(" %02X", buffer[i]); |
| ktownsend | 0:ace2e8d3ce79 | 292 | } |
| ktownsend | 0:ace2e8d3ce79 | 293 | uart.printf("\r\n"); |
| ktownsend | 0:ace2e8d3ce79 | 294 | |
| ktownsend | 0:ace2e8d3ce79 | 295 | /* ToDo: Check response */ |
| ktownsend | 0:ace2e8d3ce79 | 296 | wait(0.1); |
| ktownsend | 0:ace2e8d3ce79 | 297 | |
| ktownsend | 0:ace2e8d3ce79 | 298 | return BLE_ERROR_NONE; |
| ktownsend | 0:ace2e8d3ce79 | 299 | } |
| ktownsend | 0:ace2e8d3ce79 | 300 | |
| ktownsend | 0:ace2e8d3ce79 | 301 | /**************************************************************************/ |
| ktownsend | 0:ace2e8d3ce79 | 302 | /*! |
| ktownsend | 0:ace2e8d3ce79 | 303 | @brief Starts the BLE HW, initialising any services that were |
| ktownsend | 0:ace2e8d3ce79 | 304 | added before this function was called. |
| ktownsend | 0:ace2e8d3ce79 | 305 | |
| ktownsend | 0:ace2e8d3ce79 | 306 | @note All services must be added before calling this function! |
| ktownsend | 7:5e1f0d7f7c7d | 307 | |
| ktownsend | 7:5e1f0d7f7c7d | 308 | @returns ble_error_t |
| ktownsend | 7:5e1f0d7f7c7d | 309 | |
| ktownsend | 7:5e1f0d7f7c7d | 310 | @retval BLE_ERROR_NONE |
| ktownsend | 7:5e1f0d7f7c7d | 311 | Everything executed properly |
| ktownsend | 7:5e1f0d7f7c7d | 312 | |
| ktownsend | 7:5e1f0d7f7c7d | 313 | @section EXAMPLE |
| ktownsend | 7:5e1f0d7f7c7d | 314 | |
| ktownsend | 7:5e1f0d7f7c7d | 315 | @code |
| ktownsend | 7:5e1f0d7f7c7d | 316 | |
| ktownsend | 7:5e1f0d7f7c7d | 317 | @endcode |
| ktownsend | 0:ace2e8d3ce79 | 318 | */ |
| ktownsend | 0:ace2e8d3ce79 | 319 | /**************************************************************************/ |
| ktownsend | 0:ace2e8d3ce79 | 320 | ble_error_t nRF51822::start(void) |
| ktownsend | 0:ace2e8d3ce79 | 321 | { |
| ktownsend | 0:ace2e8d3ce79 | 322 | /* Command ID = 0x0003, No payload */ |
| ktownsend | 0:ace2e8d3ce79 | 323 | uart.printf("10 03 00 00\r\n"); |
| ktownsend | 0:ace2e8d3ce79 | 324 | |
| ktownsend | 0:ace2e8d3ce79 | 325 | /* ToDo: Check response */ |
| ktownsend | 0:ace2e8d3ce79 | 326 | wait(0.5); |
| ktownsend | 0:ace2e8d3ce79 | 327 | |
| ktownsend | 0:ace2e8d3ce79 | 328 | return BLE_ERROR_NONE; |
| ktownsend | 0:ace2e8d3ce79 | 329 | } |
| ktownsend | 0:ace2e8d3ce79 | 330 | |
| ktownsend | 0:ace2e8d3ce79 | 331 | /**************************************************************************/ |
| ktownsend | 0:ace2e8d3ce79 | 332 | /*! |
| ktownsend | 0:ace2e8d3ce79 | 333 | @brief Stops the BLE HW and disconnects from any devices |
| ktownsend | 7:5e1f0d7f7c7d | 334 | |
| ktownsend | 7:5e1f0d7f7c7d | 335 | @returns ble_error_t |
| ktownsend | 7:5e1f0d7f7c7d | 336 | |
| ktownsend | 7:5e1f0d7f7c7d | 337 | @retval BLE_ERROR_NONE |
| ktownsend | 7:5e1f0d7f7c7d | 338 | Everything executed properly |
| ktownsend | 7:5e1f0d7f7c7d | 339 | |
| ktownsend | 7:5e1f0d7f7c7d | 340 | @section EXAMPLE |
| ktownsend | 7:5e1f0d7f7c7d | 341 | |
| ktownsend | 7:5e1f0d7f7c7d | 342 | @code |
| ktownsend | 7:5e1f0d7f7c7d | 343 | |
| ktownsend | 7:5e1f0d7f7c7d | 344 | @endcode |
| ktownsend | 0:ace2e8d3ce79 | 345 | */ |
| ktownsend | 0:ace2e8d3ce79 | 346 | /**************************************************************************/ |
| ktownsend | 0:ace2e8d3ce79 | 347 | ble_error_t nRF51822::stop(void) |
| ktownsend | 0:ace2e8d3ce79 | 348 | { |
| ktownsend | 0:ace2e8d3ce79 | 349 | /* Command ID = 0x0004, No payload */ |
| ktownsend | 0:ace2e8d3ce79 | 350 | uart.printf("10 04 00 00\r\n"); |
| ktownsend | 0:ace2e8d3ce79 | 351 | |
| ktownsend | 0:ace2e8d3ce79 | 352 | /* ToDo: Check response */ |
| ktownsend | 0:ace2e8d3ce79 | 353 | wait(0.1); |
| ktownsend | 0:ace2e8d3ce79 | 354 | |
| ktownsend | 0:ace2e8d3ce79 | 355 | return BLE_ERROR_NONE; |
| ktownsend | 0:ace2e8d3ce79 | 356 | } |
| ktownsend | 0:ace2e8d3ce79 | 357 | |
| ktownsend | 0:ace2e8d3ce79 | 358 | /**************************************************************************/ |
| ktownsend | 0:ace2e8d3ce79 | 359 | /*! |
| ktownsend | 0:ace2e8d3ce79 | 360 | @brief Resets the BLE HW, removing any existing services and |
| ktownsend | 0:ace2e8d3ce79 | 361 | characteristics |
| ktownsend | 7:5e1f0d7f7c7d | 362 | |
| ktownsend | 7:5e1f0d7f7c7d | 363 | @returns ble_error_t |
| ktownsend | 7:5e1f0d7f7c7d | 364 | |
| ktownsend | 7:5e1f0d7f7c7d | 365 | @retval BLE_ERROR_NONE |
| ktownsend | 7:5e1f0d7f7c7d | 366 | Everything executed properly |
| ktownsend | 7:5e1f0d7f7c7d | 367 | |
| ktownsend | 7:5e1f0d7f7c7d | 368 | @section EXAMPLE |
| ktownsend | 7:5e1f0d7f7c7d | 369 | |
| ktownsend | 7:5e1f0d7f7c7d | 370 | @code |
| ktownsend | 7:5e1f0d7f7c7d | 371 | |
| ktownsend | 7:5e1f0d7f7c7d | 372 | @endcode |
| ktownsend | 0:ace2e8d3ce79 | 373 | */ |
| ktownsend | 0:ace2e8d3ce79 | 374 | /**************************************************************************/ |
| ktownsend | 0:ace2e8d3ce79 | 375 | ble_error_t nRF51822::reset(void) |
| ktownsend | 0:ace2e8d3ce79 | 376 | { |
| ktownsend | 0:ace2e8d3ce79 | 377 | /* Command ID = 0x0005, No payload */ |
| ktownsend | 0:ace2e8d3ce79 | 378 | uart.printf("10 05 00 00\r\n"); |
| ktownsend | 0:ace2e8d3ce79 | 379 | |
| ktownsend | 0:ace2e8d3ce79 | 380 | /* Reset the service counter */ |
| ktownsend | 0:ace2e8d3ce79 | 381 | serviceCount = 0; |
| ktownsend | 0:ace2e8d3ce79 | 382 | |
| ktownsend | 0:ace2e8d3ce79 | 383 | /* Wait for the radio to come back up */ |
| ktownsend | 0:ace2e8d3ce79 | 384 | wait(1); |
| ktownsend | 0:ace2e8d3ce79 | 385 | |
| ktownsend | 0:ace2e8d3ce79 | 386 | return BLE_ERROR_NONE; |
| ktownsend | 0:ace2e8d3ce79 | 387 | } |
