use UART Service to loopback anything received on the TX characteristic onto the RX.

Dependencies:   BLE_API mbed nRF51822

Fork of BLE_LoopbackUART by Bluetooth Low Energy

Committer:
edwardTW
Date:
Wed Sep 24 09:08:28 2014 +0000
Revision:
8:e35636d40bd2
Parent:
6:e0fc9072e853
-1

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
edwardTW 8:e35636d40bd2 22 #define NEED_CONSOLE_OUTPUT 1 /* 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
edwardTW 8:e35636d40bd2 31 //=======================================================================================
edwardTW 8:e35636d40bd2 32 typedef unsigned int uint;
edwardTW 8:e35636d40bd2 33 typedef unsigned char uchar;
edwardTW 8:e35636d40bd2 34 //=======================================================================================
edwardTW 8:e35636d40bd2 35
edwardTW 8:e35636d40bd2 36 Serial pc(P0_9,P0_11);
Rohit Grover 2:e060367b9024 37 BLEDevice ble;
edwardTW 8:e35636d40bd2 38 Ticker ticker;
Rohit Grover 2:e060367b9024 39 DigitalOut led1(LED1);
yihui 0:e910d9bb040f 40
edwardTW 8:e35636d40bd2 41 void attime(void);
edwardTW 8:e35636d40bd2 42 void periodicCallback(void);
edwardTW 8:e35636d40bd2 43
edwardTW 8:e35636d40bd2 44 uint TSM,TSMp,TSMf;
edwardTW 8:e35636d40bd2 45 uchar timer_second;
edwardTW 8:e35636d40bd2 46 uchar timer_minute;
edwardTW 8:e35636d40bd2 47 uchar timer_hour;
edwardTW 8:e35636d40bd2 48
rgrover1 6:e0fc9072e853 49 UARTService *uartServicePtr;
yihui 0:e910d9bb040f 50
rgrover1 5:4bc41267a03a 51 void disconnectionCallback(Gap::Handle_t handle, Gap::DisconnectionReason_t reason)
yihui 0:e910d9bb040f 52 {
Rohit Grover 2:e060367b9024 53 DEBUG("Disconnected!\n\r");
Rohit Grover 2:e060367b9024 54 DEBUG("Restarting the advertising process\n\r");
Rohit Grover 2:e060367b9024 55 ble.startAdvertising();
Rohit Grover 2:e060367b9024 56 }
yihui 0:e910d9bb040f 57
rgrover1 6:e0fc9072e853 58 void onDataWritten(const GattCharacteristicWriteCBParams *params)
yihui 0:e910d9bb040f 59 {
rgrover1 6:e0fc9072e853 60 if ((uartServicePtr != NULL) && (params->charHandle == uartServicePtr->getTXCharacteristicHandle())) {
rgrover1 5:4bc41267a03a 61 uint16_t bytesRead = params->len;
edwardTW 8:e35636d40bd2 62 DEBUG("received %s \n\r",params->data);
rgrover1 5:4bc41267a03a 63 DEBUG("received %u bytes\n\r", bytesRead);
rgrover1 6:e0fc9072e853 64 ble.updateCharacteristicValue(uartServicePtr->getRXCharacteristicHandle(), params->data, bytesRead);
yihui 0:e910d9bb040f 65 }
Rohit Grover 2:e060367b9024 66 }
yihui 0:e910d9bb040f 67
Rohit Grover 2:e060367b9024 68 void periodicCallback(void)
Rohit Grover 2:e060367b9024 69 {
rgrover1 6:e0fc9072e853 70 led1 = !led1;
Rohit Grover 2:e060367b9024 71 }
edwardTW 8:e35636d40bd2 72 void attime(void)
edwardTW 8:e35636d40bd2 73 {
edwardTW 8:e35636d40bd2 74 TSMp=TSM;
edwardTW 8:e35636d40bd2 75 TSM++;
edwardTW 8:e35636d40bd2 76 TSMf|=TSM^TSMp;
edwardTW 8:e35636d40bd2 77 led1 = !led1;
edwardTW 8:e35636d40bd2 78 }
yihui 0:e910d9bb040f 79 int main(void)
yihui 0:e910d9bb040f 80 {
Rohit Grover 2:e060367b9024 81 led1 = 1;
edwardTW 8:e35636d40bd2 82 // Ticker ticker;
edwardTW 8:e35636d40bd2 83 ticker.attach(periodicCallback, 0.125);
edwardTW 8:e35636d40bd2 84 // ticker.attach_us(attime, 2440);
edwardTW 8:e35636d40bd2 85 pc.baud(115200);
Rohit Grover 2:e060367b9024 86 DEBUG("Initialising the nRF51822\n\r");
Rohit Grover 2:e060367b9024 87 ble.init();
Rohit Grover 2:e060367b9024 88 ble.onDisconnection(disconnectionCallback);
Rohit Grover 2:e060367b9024 89 ble.onDataWritten(onDataWritten);
yihui 0:e910d9bb040f 90
Rohit Grover 2:e060367b9024 91 /* setup advertising */
Rohit Grover 2:e060367b9024 92 ble.accumulateAdvertisingPayload(GapAdvertisingData::BREDR_NOT_SUPPORTED);
Rohit Grover 2:e060367b9024 93 ble.setAdvertisingType(GapAdvertisingParams::ADV_CONNECTABLE_UNDIRECTED);
Rohit Grover 2:e060367b9024 94 ble.accumulateAdvertisingPayload(GapAdvertisingData::SHORTENED_LOCAL_NAME,
edwardTW 8:e35636d40bd2 95 (const uint8_t *)"BLE_UART", sizeof("BLE_UART") - 1);
Rohit Grover 2:e060367b9024 96 ble.accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LIST_128BIT_SERVICE_IDS,
rgrover1 6:e0fc9072e853 97 (const uint8_t *)UARTServiceUUID_reversed, sizeof(UARTServiceUUID_reversed));
yihui 0:e910d9bb040f 98
Rohit Grover 2:e060367b9024 99 ble.setAdvertisingInterval(160); /* 100ms; in multiples of 0.625ms. */
edwardTW 8:e35636d40bd2 100 // ble.setAdvertisingInterval(320); /* 100ms; in multiples of 0.625ms. */
Rohit Grover 2:e060367b9024 101 ble.startAdvertising();
yihui 0:e910d9bb040f 102
rgrover1 6:e0fc9072e853 103 UARTService uartService(ble);
rgrover1 6:e0fc9072e853 104 uartServicePtr = &uartService;
yihui 0:e910d9bb040f 105
Rohit Grover 2:e060367b9024 106 while (true) {
Rohit Grover 2:e060367b9024 107 ble.waitForEvent();
yihui 0:e910d9bb040f 108 }
yihui 0:e910d9bb040f 109 }
edwardTW 8:e35636d40bd2 110