Alexander Lea / Mbed 2 deprecated BLE_CarPeripheral

Dependencies:   BLE_API mbed nRF51822

Fork of BLE_GATT_test1 by Alexander Lea

Committer:
alexanderlea
Date:
Fri Mar 27 12:21:12 2015 +0000
Revision:
12:f5b12e8b6043
Parent:
11:35b63ab4c76c
Child:
13:a578c382cb7d
Switch input and BLE working correctly :)

Who changed what in which revision?

UserRevisionLine numberNew contents of line
alexanderlea 0:af868ad47854 1 #include "mbed.h"
alexanderlea 0:af868ad47854 2 #include "BLEDevice.h"
alexanderlea 4:ac0ee88ea0ed 3 #include "BroadcasterService.h"
alexanderlea 10:2c5c202c69a5 4 #include "ErrorService.h"
alexanderlea 0:af868ad47854 5 #include <string>
alexanderlea 0:af868ad47854 6
alexanderlea 0:af868ad47854 7 using namespace std;
alexanderlea 0:af868ad47854 8
alexanderlea 0:af868ad47854 9 BLEDevice ble;
alexanderlea 0:af868ad47854 10 DigitalOut led1(LED1);
alexanderlea 12:f5b12e8b6043 11 InterruptIn indicatorIn(p5);
alexanderlea 0:af868ad47854 12 Serial pc(USBTX, USBRX);
alexanderlea 0:af868ad47854 13
alexanderlea 0:af868ad47854 14 /*Variable Declarations*/
alexanderlea 3:f3d20b36b7ea 15 const static char DEVICE_NAME[] = "BLE_Broadcaster";
alexanderlea 11:35b63ab4c76c 16 static volatile bool indicatorOn = false;
alexanderlea 11:35b63ab4c76c 17 static volatile bool indicatorSent = false;
alexanderlea 11:35b63ab4c76c 18 uint8_t cmdOn[8] = { 0x4d,0x32,0x81,0xc0,0x4d,0x4d,0x4d,0x4d };
alexanderlea 12:f5b12e8b6043 19 uint8_t cmdOff[8] = { 0x4d,0x32,0x81,0xc0,0x32,0x32,0x32,0x32 };
alexanderlea 12:f5b12e8b6043 20
alexanderlea 12:f5b12e8b6043 21 /** Callback function for ticker */
alexanderlea 0:af868ad47854 22 void blink(void)
alexanderlea 0:af868ad47854 23 {
alexanderlea 12:f5b12e8b6043 24 led1 = !led1; /* Do blinky on LED1 while we're waiting for BLE events */
alexanderlea 12:f5b12e8b6043 25 //pc.printf("Tick\r\n");
alexanderlea 11:35b63ab4c76c 26 }
alexanderlea 5:b3f8e10b9602 27
alexanderlea 12:f5b12e8b6043 28 /** Callback routine is interrupt activated by a debounced button hit*/
alexanderlea 12:f5b12e8b6043 29 void buttonPressed(void) {
alexanderlea 11:35b63ab4c76c 30 indicatorOn = true;
alexanderlea 11:35b63ab4c76c 31 indicatorSent = false;
alexanderlea 12:f5b12e8b6043 32 pc.printf("Switch on. Is now %d \r\n", indicatorOn);
alexanderlea 11:35b63ab4c76c 33 }
alexanderlea 11:35b63ab4c76c 34
alexanderlea 12:f5b12e8b6043 35 /** Callback function for button (indicatorIn) being released */
alexanderlea 12:f5b12e8b6043 36 void buttonReleased(void) {
alexanderlea 11:35b63ab4c76c 37 indicatorOn = false;
alexanderlea 11:35b63ab4c76c 38 indicatorSent = false;
alexanderlea 12:f5b12e8b6043 39 pc.printf("Switch off. Is now %d \r\n", indicatorOn);
alexanderlea 0:af868ad47854 40 }
alexanderlea 0:af868ad47854 41
alexanderlea 12:f5b12e8b6043 42 /** Callback function for BLE disconnection */
alexanderlea 0:af868ad47854 43 void disconnectionCallback(Gap::Handle_t handle, Gap::DisconnectionReason_t reason)
alexanderlea 0:af868ad47854 44 {
alexanderlea 0:af868ad47854 45 pc.printf("Disconnected! - start advertising. Handle:%d, Reason:0x%02x\r\n", handle, reason);
alexanderlea 0:af868ad47854 46 ble.startAdvertising();
alexanderlea 0:af868ad47854 47 }
alexanderlea 0:af868ad47854 48
alexanderlea 12:f5b12e8b6043 49 /** Callback function for BLE connection */
alexanderlea 0:af868ad47854 50 void connectionCallback(Gap::Handle_t handle, Gap::addr_type_t peerAddrType, const Gap::address_t peerAddr, const Gap::ConnectionParams_t *parms)
alexanderlea 0:af868ad47854 51 {
alexanderlea 0:af868ad47854 52 pc.printf("Connected! - stop advertising. Handle:%d, eType:%d, Add:%u.\r\n", handle, peerAddrType, peerAddr);
alexanderlea 3:f3d20b36b7ea 53 ble.stopAdvertising();
alexanderlea 0:af868ad47854 54 }
alexanderlea 0:af868ad47854 55
alexanderlea 0:af868ad47854 56 int main(void)
alexanderlea 12:f5b12e8b6043 57 {
alexanderlea 11:35b63ab4c76c 58 /*Setup switch input*/
alexanderlea 12:f5b12e8b6043 59 indicatorIn.mode(PullUp);
alexanderlea 11:35b63ab4c76c 60 // Delay for initial pullup to take effect
alexanderlea 11:35b63ab4c76c 61 wait(.01);
alexanderlea 12:f5b12e8b6043 62 // Setup Interrupt callback function for a button hit
alexanderlea 12:f5b12e8b6043 63 indicatorIn.fall(&buttonPressed);
alexanderlea 12:f5b12e8b6043 64 indicatorIn.rise(&buttonReleased);
alexanderlea 11:35b63ab4c76c 65
alexanderlea 11:35b63ab4c76c 66 /*Setup Blinky*/
alexanderlea 12:f5b12e8b6043 67 led1 = 1;
alexanderlea 12:f5b12e8b6043 68 Ticker t;
alexanderlea 12:f5b12e8b6043 69 t.attach(&blink, 1);
alexanderlea 4:ac0ee88ea0ed 70
alexanderlea 11:35b63ab4c76c 71 /*Setup BLE*/
alexanderlea 0:af868ad47854 72 ble.init();
alexanderlea 0:af868ad47854 73 ble.onDisconnection(disconnectionCallback);
alexanderlea 0:af868ad47854 74 ble.onConnection(connectionCallback);
alexanderlea 0:af868ad47854 75
alexanderlea 11:35b63ab4c76c 76 //create services
alexanderlea 9:0ed64b14d46b 77 BroadcasterService broadcasterService(ble);
alexanderlea 10:2c5c202c69a5 78 ErrorService errorService(ble);
alexanderlea 4:ac0ee88ea0ed 79
alexanderlea 0:af868ad47854 80 /*
alexanderlea 0:af868ad47854 81 **BREDR_NOT_SUPPORTED = BLE only
alexanderlea 0:af868ad47854 82 **LE_GENERAL_DISCOVERABLE = Device is discoverable at any moment (no time out)
alexanderlea 0:af868ad47854 83 **ADV_CONNECTABLE_UNDIRECTED = Any central device can connect
alexanderlea 0:af868ad47854 84 */
alexanderlea 0:af868ad47854 85 ble.accumulateAdvertisingPayload(GapAdvertisingData::BREDR_NOT_SUPPORTED | GapAdvertisingData::LE_GENERAL_DISCOVERABLE);
alexanderlea 0:af868ad47854 86 // ble.accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LIST_16BIT_SERVICE_IDS, (uint8_t *)uuid16_list, sizeof(uuid16_list));
alexanderlea 0:af868ad47854 87 ble.accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LOCAL_NAME, (uint8_t *)DEVICE_NAME, sizeof(DEVICE_NAME));
alexanderlea 0:af868ad47854 88 ble.setAdvertisingType(GapAdvertisingParams::ADV_CONNECTABLE_UNDIRECTED);
alexanderlea 11:35b63ab4c76c 89
alexanderlea 0:af868ad47854 90 ble.setAdvertisingInterval(160); /* 1s; in multiples of 0.625ms. */ //was 1600
alexanderlea 0:af868ad47854 91 ble.startAdvertising();
alexanderlea 0:af868ad47854 92
alexanderlea 0:af868ad47854 93 pc.printf("Advertising node %s\n\r", DEVICE_NAME);
alexanderlea 0:af868ad47854 94
alexanderlea 11:35b63ab4c76c 95 //loop forever
alexanderlea 0:af868ad47854 96 while(true) {
alexanderlea 12:f5b12e8b6043 97 ble.waitForEvent(); // this should return upon any system event (such as an interrupt or a ticker wakeup)
alexanderlea 11:35b63ab4c76c 98
alexanderlea 11:35b63ab4c76c 99 if(indicatorOn) { //if button is pressed
alexanderlea 11:35b63ab4c76c 100 if(!indicatorSent) { //should only fire the first time!
alexanderlea 11:35b63ab4c76c 101 pc.printf("Command on = %u\r\n", cmdOn);
alexanderlea 5:b3f8e10b9602 102 broadcasterService.sendCommand(cmdOn);
alexanderlea 11:35b63ab4c76c 103 indicatorSent = true; //set true to stop multiple firing
alexanderlea 11:35b63ab4c76c 104 }
alexanderlea 11:35b63ab4c76c 105 } else {
alexanderlea 11:35b63ab4c76c 106 if(!indicatorSent) {
alexanderlea 11:35b63ab4c76c 107 pc.printf("Command off = %u\r\n", cmdOff);
alexanderlea 5:b3f8e10b9602 108 broadcasterService.sendCommand(cmdOff);
alexanderlea 11:35b63ab4c76c 109 indicatorSent = true; //set true to stop multiple firing
alexanderlea 5:b3f8e10b9602 110 }
alexanderlea 0:af868ad47854 111 }
alexanderlea 0:af868ad47854 112 }
alexanderlea 0:af868ad47854 113 }