Connect the BLE_UART Console to a PC USB/Serial Console. Data written to PC console is sent over BLE UART Data received from BLE UART is displayed in PC console

Dependencies:   BLE_API mbed nRF51822

Fork of BLE_LED_Controller by UCL IoT

Committer:
bthomsen
Date:
Wed Dec 17 19:46:22 2014 +0000
Revision:
12:36a9f01cfa0a
Parent:
10:633cec718bf4
Child:
13:291a8f177400
Initial Commit: Added comments

Who changed what in which revision?

UserRevisionLine numberNew contents of line
yihui 0:e910d9bb040f 1 /* mbed Microcontroller Library
yihui 0:e910d9bb040f 2 * Copyright (c) 2006-2013 ARM Limited
yihui 0:e910d9bb040f 3 *
yihui 0:e910d9bb040f 4 * Licensed under the Apache License, Version 2.0 (the "License");
yihui 0:e910d9bb040f 5 * you may not use this file except in compliance with the License.
yihui 0:e910d9bb040f 6 * You may obtain a copy of the License at
yihui 0:e910d9bb040f 7 *
yihui 0:e910d9bb040f 8 * http://www.apache.org/licenses/LICENSE-2.0
yihui 0:e910d9bb040f 9 *
yihui 0:e910d9bb040f 10 * Unless required by applicable law or agreed to in writing, software
yihui 0:e910d9bb040f 11 * distributed under the License is distributed on an "AS IS" BASIS,
yihui 0:e910d9bb040f 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
yihui 0:e910d9bb040f 13 * See the License for the specific language governing permissions and
yihui 0:e910d9bb040f 14 * limitations under the License.
yihui 0:e910d9bb040f 15 */
yihui 0:e910d9bb040f 16
yihui 0:e910d9bb040f 17 #include "mbed.h"
Rohit Grover 2:e060367b9024 18 #include "BLEDevice.h"
yihui 0:e910d9bb040f 19
rgrover1 6:e0fc9072e853 20 #include "UARTService.h"
yihui 0:e910d9bb040f 21
rgrover1 6:e0fc9072e853 22 #define NEED_CONSOLE_OUTPUT 0 /* Set this if you need debug messages on the console;
Rohit Grover 2:e060367b9024 23 * it will have an impact on code-size and power consumption. */
yihui 0:e910d9bb040f 24
Rohit Grover 2:e060367b9024 25 #if NEED_CONSOLE_OUTPUT
rgrover1 6:e0fc9072e853 26 #define DEBUG(...) { printf(__VA_ARGS__); }
yihui 0:e910d9bb040f 27 #else
Rohit Grover 2:e060367b9024 28 #define DEBUG(...) /* nothing */
Rohit Grover 2:e060367b9024 29 #endif /* #if NEED_CONSOLE_OUTPUT */
yihui 0:e910d9bb040f 30
Rohit Grover 2:e060367b9024 31 BLEDevice ble;
Rohit Grover 2:e060367b9024 32 DigitalOut led1(LED1);
yihui 0:e910d9bb040f 33
rgrover1 6:e0fc9072e853 34 UARTService *uartServicePtr;
yihui 0:e910d9bb040f 35
rgrover1 5:4bc41267a03a 36 void disconnectionCallback(Gap::Handle_t handle, Gap::DisconnectionReason_t reason)
yihui 0:e910d9bb040f 37 {
Rohit Grover 2:e060367b9024 38 DEBUG("Disconnected!\n\r");
Rohit Grover 2:e060367b9024 39 DEBUG("Restarting the advertising process\n\r");
Rohit Grover 2:e060367b9024 40 ble.startAdvertising();
Rohit Grover 2:e060367b9024 41 }
yihui 0:e910d9bb040f 42
rgrover1 6:e0fc9072e853 43 void onDataWritten(const GattCharacteristicWriteCBParams *params)
yihui 0:e910d9bb040f 44 {
rgrover1 6:e0fc9072e853 45 if ((uartServicePtr != NULL) && (params->charHandle == uartServicePtr->getTXCharacteristicHandle())) {
rgrover1 5:4bc41267a03a 46 uint16_t bytesRead = params->len;
rgrover1 5:4bc41267a03a 47 DEBUG("received %u bytes\n\r", bytesRead);
rgrover1 6:e0fc9072e853 48 ble.updateCharacteristicValue(uartServicePtr->getRXCharacteristicHandle(), params->data, bytesRead);
yihui 0:e910d9bb040f 49 }
Rohit Grover 2:e060367b9024 50 }
yihui 0:e910d9bb040f 51
bthomsen 12:36a9f01cfa0a 52 /* Periodic Ticker callback */
Rohit Grover 2:e060367b9024 53 void periodicCallback(void)
Rohit Grover 2:e060367b9024 54 {
bthomsen 12:36a9f01cfa0a 55 led1 = !led1; // Toggle LED 1
Rohit Grover 2:e060367b9024 56 }
yihui 0:e910d9bb040f 57
yihui 0:e910d9bb040f 58 int main(void)
yihui 0:e910d9bb040f 59 {
Rohit Grover 2:e060367b9024 60 led1 = 1;
bthomsen 12:36a9f01cfa0a 61 Ticker ticker; // Create period timer
bthomsen 12:36a9f01cfa0a 62 ticker.attach(periodicCallback, 1); // Attach ticker callback function with a period of 1 second
yihui 0:e910d9bb040f 63
Rohit Grover 2:e060367b9024 64 DEBUG("Initialising the nRF51822\n\r");
Rohit Grover 2:e060367b9024 65 ble.init();
Rohit Grover 2:e060367b9024 66 ble.onDisconnection(disconnectionCallback);
Rohit Grover 2:e060367b9024 67 ble.onDataWritten(onDataWritten);
yihui 0:e910d9bb040f 68
Rohit Grover 2:e060367b9024 69 /* setup advertising */
Rohit Grover 2:e060367b9024 70 ble.accumulateAdvertisingPayload(GapAdvertisingData::BREDR_NOT_SUPPORTED);
Rohit Grover 2:e060367b9024 71 ble.setAdvertisingType(GapAdvertisingParams::ADV_CONNECTABLE_UNDIRECTED);
Rohit Grover 2:e060367b9024 72 ble.accumulateAdvertisingPayload(GapAdvertisingData::SHORTENED_LOCAL_NAME,
rgrover1 6:e0fc9072e853 73 (const uint8_t *)"BLE UART", sizeof("BLE UART") - 1);
Rohit Grover 2:e060367b9024 74 ble.accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LIST_128BIT_SERVICE_IDS,
rgrover1 6:e0fc9072e853 75 (const uint8_t *)UARTServiceUUID_reversed, sizeof(UARTServiceUUID_reversed));
yihui 0:e910d9bb040f 76
rgrover1 10:633cec718bf4 77 ble.setAdvertisingInterval(Gap::MSEC_TO_ADVERTISEMENT_DURATION_UNITS(1000));
Rohit Grover 2:e060367b9024 78 ble.startAdvertising();
yihui 0:e910d9bb040f 79
rgrover1 6:e0fc9072e853 80 UARTService uartService(ble);
rgrover1 6:e0fc9072e853 81 uartServicePtr = &uartService;
yihui 0:e910d9bb040f 82
Rohit Grover 2:e060367b9024 83 while (true) {
Rohit Grover 2:e060367b9024 84 ble.waitForEvent();
yihui 0:e910d9bb040f 85 }
yihui 0:e910d9bb040f 86 }