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:36:36 2015 +0000
Revision:
13:a578c382cb7d
Parent:
12:f5b12e8b6043
Child:
14:7225b50aaaf7
Formatting and tidying and commenting

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