Joan BLE Dimmer

Dependencies:   BLE_API mbed nRF51822

Fork of BLE_LED_Controller by UCL IoT

Committer:
bthomsen
Date:
Wed Dec 17 22:43:40 2014 +0000
Revision:
13:291a8f177400
Parent:
12:36a9f01cfa0a
Child:
14:8ff3bfb6b19d
modified to control LED2 by sending commands over BLE; "led2 on" turns LED2 on; "led2 off" turns LED2 off;

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
bthomsen 13:291a8f177400 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
bthomsen 13:291a8f177400 31 #define LED2OFF "led2 off"
bthomsen 13:291a8f177400 32 #define LED2ON "led2 on"
bthomsen 13:291a8f177400 33
bthomsen 13:291a8f177400 34
bthomsen 13:291a8f177400 35 //char rxPayload[CMD_SIZE];
bthomsen 13:291a8f177400 36
bthomsen 13:291a8f177400 37 BLEDevice ble; // Create Bluetooth object
bthomsen 13:291a8f177400 38 DigitalOut led1(LED1); // Set the pin attached to LED1 as an output
bthomsen 13:291a8f177400 39 DigitalOut led2(LED2); // Set the pin attached to LED2 as an output
yihui 0:e910d9bb040f 40
rgrover1 6:e0fc9072e853 41 UARTService *uartServicePtr;
yihui 0:e910d9bb040f 42
bthomsen 13:291a8f177400 43 /* BLE disconnected callback */
rgrover1 5:4bc41267a03a 44 void disconnectionCallback(Gap::Handle_t handle, Gap::DisconnectionReason_t reason)
yihui 0:e910d9bb040f 45 {
Rohit Grover 2:e060367b9024 46 DEBUG("Disconnected!\n\r");
Rohit Grover 2:e060367b9024 47 DEBUG("Restarting the advertising process\n\r");
Rohit Grover 2:e060367b9024 48 ble.startAdvertising();
Rohit Grover 2:e060367b9024 49 }
bthomsen 13:291a8f177400 50 /* BLE UART data received callback */
rgrover1 6:e0fc9072e853 51 void onDataWritten(const GattCharacteristicWriteCBParams *params)
yihui 0:e910d9bb040f 52 {
bthomsen 13:291a8f177400 53 if ((uartServicePtr != NULL) && (params->charHandle == uartServicePtr->getTXCharacteristicHandle())) { //If characters received over BLE
rgrover1 5:4bc41267a03a 54 uint16_t bytesRead = params->len;
rgrover1 5:4bc41267a03a 55 DEBUG("received %u bytes\n\r", bytesRead);
bthomsen 13:291a8f177400 56 //strncpy(rxPayload, (const char *)params->data, bytesRead);
bthomsen 13:291a8f177400 57 DEBUG("Received string: '");
bthomsen 13:291a8f177400 58 DEBUG((const char *)params->data); //Note the size of data expands to the largest string received. Need to use bytesRead to resize.
bthomsen 13:291a8f177400 59 DEBUG("'\n\r");
bthomsen 13:291a8f177400 60 if (!strncmp(LED2ON,(const char *)params->data,bytesRead)) led2 = 1; // If the received and command string are equal turn led2 on. Note strcmp returns 0 if strings are equal
bthomsen 13:291a8f177400 61 if (!strncmp(LED2OFF,(const char *)params->data,bytesRead)) led2 = 0; // If the received and command string are equal turn led2 off.
bthomsen 13:291a8f177400 62 //Toggle LED2 when data received
bthomsen 13:291a8f177400 63 ble.updateCharacteristicValue(uartServicePtr->getRXCharacteristicHandle(), params->data, bytesRead); // Echo received characters back over BLE
yihui 0:e910d9bb040f 64 }
Rohit Grover 2:e060367b9024 65 }
yihui 0:e910d9bb040f 66
bthomsen 12:36a9f01cfa0a 67 /* Periodic Ticker callback */
Rohit Grover 2:e060367b9024 68 void periodicCallback(void)
Rohit Grover 2:e060367b9024 69 {
bthomsen 12:36a9f01cfa0a 70 led1 = !led1; // Toggle LED 1
Rohit Grover 2:e060367b9024 71 }
yihui 0:e910d9bb040f 72
yihui 0:e910d9bb040f 73 int main(void)
yihui 0:e910d9bb040f 74 {
Rohit Grover 2:e060367b9024 75 led1 = 1;
bthomsen 13:291a8f177400 76 led2 = 0;
bthomsen 12:36a9f01cfa0a 77 Ticker ticker; // Create period timer
bthomsen 12:36a9f01cfa0a 78 ticker.attach(periodicCallback, 1); // Attach ticker callback function with a period of 1 second
yihui 0:e910d9bb040f 79
Rohit Grover 2:e060367b9024 80 DEBUG("Initialising the nRF51822\n\r");
Rohit Grover 2:e060367b9024 81 ble.init();
bthomsen 13:291a8f177400 82 ble.onDisconnection(disconnectionCallback); // Define callback function for BLE disconnection event
bthomsen 13:291a8f177400 83 ble.onDataWritten(onDataWritten); // Define callback function for BLE Data received event
yihui 0:e910d9bb040f 84
Rohit Grover 2:e060367b9024 85 /* setup advertising */
bthomsen 13:291a8f177400 86 ble.accumulateAdvertisingPayload(GapAdvertisingData::BREDR_NOT_SUPPORTED); // Indicate that Legacy Bluetooth in not supported
Rohit Grover 2:e060367b9024 87 ble.setAdvertisingType(GapAdvertisingParams::ADV_CONNECTABLE_UNDIRECTED);
Rohit Grover 2:e060367b9024 88 ble.accumulateAdvertisingPayload(GapAdvertisingData::SHORTENED_LOCAL_NAME,
rgrover1 6:e0fc9072e853 89 (const uint8_t *)"BLE UART", sizeof("BLE UART") - 1);
Rohit Grover 2:e060367b9024 90 ble.accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LIST_128BIT_SERVICE_IDS,
rgrover1 6:e0fc9072e853 91 (const uint8_t *)UARTServiceUUID_reversed, sizeof(UARTServiceUUID_reversed));
yihui 0:e910d9bb040f 92
bthomsen 13:291a8f177400 93 ble.setAdvertisingInterval(Gap::MSEC_TO_ADVERTISEMENT_DURATION_UNITS(1000)); // Set advertising interval to 1 second
bthomsen 13:291a8f177400 94 ble.startAdvertising(); // Start advertising
yihui 0:e910d9bb040f 95
bthomsen 13:291a8f177400 96 UARTService uartService(ble); // Create BLE UART service
bthomsen 13:291a8f177400 97 uartServicePtr = &uartService; // Initalise pointer to point to UART Service
yihui 0:e910d9bb040f 98
Rohit Grover 2:e060367b9024 99 while (true) {
bthomsen 13:291a8f177400 100 ble.waitForEvent(); // Wait for BLE events
yihui 0:e910d9bb040f 101 }
yihui 0:e910d9bb040f 102 }