Dissertation project, looking at BLE communication in cars. This project is BLE peripheral acting as car indicator stalk

Dependencies:   BLE_API mbed nRF51822

Fork of BLE_GATT_test1 by Alexander Lea

Committer:
alexanderlea
Date:
Thu Apr 16 17:58:05 2015 +0000
Revision:
16:d821122547b3
Parent:
15:ad1d37e51a26
Child:
17:df2f1d5c69a8
Re-factored to deal with events better, and added functionality for break switch too!

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 16:d821122547b3 12 InterruptIn brakeIn(p2);
alexanderlea 0:af868ad47854 13 Serial pc(USBTX, USBRX);
alexanderlea 0:af868ad47854 14
alexanderlea 0:af868ad47854 15 /*Variable Declarations*/
alexanderlea 13:a578c382cb7d 16 const static char DEVICE_NAME[] = "BLE_Broadcaster";
alexanderlea 13:a578c382cb7d 17 static volatile bool indicatorOn = false;
alexanderlea 13:a578c382cb7d 18 static volatile bool indicatorSent = false;
alexanderlea 14:7225b50aaaf7 19 uint8_t cmdIndicatorOn[8] = { 0x69,0x6e,0x64,0x69,0xff,0xff,0xff,0xff }; // = I N D I 255 255 255 255
alexanderlea 13:a578c382cb7d 20 uint8_t cmdIndicatorOff[8] = { 0x69,0x6e,0x64,0x69,0x00,0x00,0x00,0x00 }; // = I N D I 0 0 0 0
alexanderlea 16:d821122547b3 21 uint8_t cmdBrakeOn[8] = { 0x42, 0x52, 0x41, 0x4b, 0xff,0xff,0xff,0xff }; // = B R A K 255 255 255 255
alexanderlea 16:d821122547b3 22 uint8_t cmdBrakeOff[8] = { 0x42, 0x52, 0x41, 0x4b,0x00,0x00,0x00,0x00 }; // = B R A K 0 0 0 0
alexanderlea 14:7225b50aaaf7 23 static const uint16_t uuid16_list[] = {BroadcasterService::BROADCAST_SERVICE_UUID};
alexanderlea 12:f5b12e8b6043 24
alexanderlea 16:d821122547b3 25 BroadcasterService* broadcasterService;
alexanderlea 16:d821122547b3 26
alexanderlea 12:f5b12e8b6043 27 /** Callback function for ticker */
alexanderlea 0:af868ad47854 28 void blink(void)
alexanderlea 0:af868ad47854 29 {
alexanderlea 12:f5b12e8b6043 30 led1 = !led1; /* Do blinky on LED1 while we're waiting for BLE events */
alexanderlea 11:35b63ab4c76c 31 }
alexanderlea 5:b3f8e10b9602 32
alexanderlea 12:f5b12e8b6043 33 /** Callback routine is interrupt activated by a debounced button hit*/
alexanderlea 13:a578c382cb7d 34 void indicatorSwitchOn(void) {
alexanderlea 16:d821122547b3 35 //indicatorOn = true;
alexanderlea 16:d821122547b3 36 // indicatorSent = false;
alexanderlea 16:d821122547b3 37 // pc.printf("Indicator switch on.\r\n");
alexanderlea 16:d821122547b3 38 pc.printf("Command Indicator on\r\n");
alexanderlea 16:d821122547b3 39 broadcasterService->sendCommand(cmdIndicatorOn);
alexanderlea 11:35b63ab4c76c 40 }
alexanderlea 11:35b63ab4c76c 41
alexanderlea 13:a578c382cb7d 42 /** Callback routine is interrupt activated by a debounced button release*/
alexanderlea 13:a578c382cb7d 43 void indicatorSwitchOff(void) {
alexanderlea 16:d821122547b3 44 //indicatorOn = false;
alexanderlea 16:d821122547b3 45 // indicatorSent = false;
alexanderlea 16:d821122547b3 46 // pc.printf("Indicator switch off.\r\n");
alexanderlea 16:d821122547b3 47 pc.printf("Command Indicator off\r\n");
alexanderlea 16:d821122547b3 48 broadcasterService->sendCommand(cmdIndicatorOff);
alexanderlea 16:d821122547b3 49 }
alexanderlea 16:d821122547b3 50
alexanderlea 16:d821122547b3 51 /** Callback routine is interrupt activated by a debounced button hit*/
alexanderlea 16:d821122547b3 52 void brakeOn(void) {
alexanderlea 16:d821122547b3 53 //indicatorOn = true;
alexanderlea 16:d821122547b3 54 // indicatorSent = false;
alexanderlea 16:d821122547b3 55 // pc.printf("Indicator switch on.\r\n");
alexanderlea 16:d821122547b3 56 pc.printf("Command Brake on\r\n");
alexanderlea 16:d821122547b3 57 broadcasterService->sendCommand(cmdBrakeOn);
alexanderlea 16:d821122547b3 58 }
alexanderlea 16:d821122547b3 59
alexanderlea 16:d821122547b3 60 /** Callback routine is interrupt activated by a debounced button release*/
alexanderlea 16:d821122547b3 61 void brakeOff(void) {
alexanderlea 16:d821122547b3 62 //indicatorOn = false;
alexanderlea 16:d821122547b3 63 // indicatorSent = false;
alexanderlea 16:d821122547b3 64 // pc.printf("Indicator switch off.\r\n");
alexanderlea 16:d821122547b3 65 pc.printf("Command Brake off\r\n");
alexanderlea 16:d821122547b3 66 broadcasterService->sendCommand(cmdBrakeOff);
alexanderlea 0:af868ad47854 67 }
alexanderlea 0:af868ad47854 68
alexanderlea 12:f5b12e8b6043 69 /** Callback function for BLE disconnection */
alexanderlea 0:af868ad47854 70 void disconnectionCallback(Gap::Handle_t handle, Gap::DisconnectionReason_t reason)
alexanderlea 0:af868ad47854 71 {
alexanderlea 0:af868ad47854 72 pc.printf("Disconnected! - start advertising. Handle:%d, Reason:0x%02x\r\n", handle, reason);
alexanderlea 0:af868ad47854 73 ble.startAdvertising();
alexanderlea 0:af868ad47854 74 }
alexanderlea 0:af868ad47854 75
alexanderlea 12:f5b12e8b6043 76 /** Callback function for BLE connection */
alexanderlea 0:af868ad47854 77 void connectionCallback(Gap::Handle_t handle, Gap::addr_type_t peerAddrType, const Gap::address_t peerAddr, const Gap::ConnectionParams_t *parms)
alexanderlea 0:af868ad47854 78 {
alexanderlea 14:7225b50aaaf7 79 pc.printf("Connected! - stop advertising. Handle:%d, eType:%d, Addr:%u.\r\n", handle, peerAddrType, peerAddr);
alexanderlea 3:f3d20b36b7ea 80 ble.stopAdvertising();
alexanderlea 0:af868ad47854 81 }
alexanderlea 0:af868ad47854 82
alexanderlea 0:af868ad47854 83 int main(void)
alexanderlea 12:f5b12e8b6043 84 {
alexanderlea 11:35b63ab4c76c 85 /*Setup switch input*/
alexanderlea 12:f5b12e8b6043 86 indicatorIn.mode(PullUp);
alexanderlea 16:d821122547b3 87 brakeIn.mode(PullUp);
alexanderlea 11:35b63ab4c76c 88 // Delay for initial pullup to take effect
alexanderlea 11:35b63ab4c76c 89 wait(.01);
alexanderlea 12:f5b12e8b6043 90 // Setup Interrupt callback function for a button hit
alexanderlea 13:a578c382cb7d 91 indicatorIn.fall(&indicatorSwitchOn);
alexanderlea 13:a578c382cb7d 92 indicatorIn.rise(&indicatorSwitchOff);
alexanderlea 11:35b63ab4c76c 93
alexanderlea 16:d821122547b3 94 brakeIn.fall(&brakeOn);
alexanderlea 16:d821122547b3 95 brakeIn.rise(&brakeOff);
alexanderlea 14:7225b50aaaf7 96 //TODO: Initial light input - if switch is ON at program start
alexanderlea 14:7225b50aaaf7 97
alexanderlea 11:35b63ab4c76c 98 /*Setup Blinky*/
alexanderlea 12:f5b12e8b6043 99 led1 = 1;
alexanderlea 12:f5b12e8b6043 100 Ticker t;
alexanderlea 12:f5b12e8b6043 101 t.attach(&blink, 1);
alexanderlea 4:ac0ee88ea0ed 102
alexanderlea 11:35b63ab4c76c 103 /*Setup BLE*/
alexanderlea 0:af868ad47854 104 ble.init();
alexanderlea 0:af868ad47854 105 ble.onDisconnection(disconnectionCallback);
alexanderlea 0:af868ad47854 106 ble.onConnection(connectionCallback);
alexanderlea 0:af868ad47854 107
alexanderlea 11:35b63ab4c76c 108 //create services
alexanderlea 16:d821122547b3 109 //BroadcasterService broadcasterService(ble);
alexanderlea 16:d821122547b3 110 broadcasterService = new BroadcasterService(ble);
alexanderlea 4:ac0ee88ea0ed 111
alexanderlea 0:af868ad47854 112 /*
alexanderlea 13:a578c382cb7d 113 * BREDR_NOT_SUPPORTED = BLE only
alexanderlea 13:a578c382cb7d 114 * LE_GENERAL_DISCOVERABLE = Device is discoverable at any moment (no time out)
alexanderlea 13:a578c382cb7d 115 * ADV_CONNECTABLE_UNDIRECTED = Any central device can connect
alexanderlea 0:af868ad47854 116 */
alexanderlea 0:af868ad47854 117 ble.accumulateAdvertisingPayload(GapAdvertisingData::BREDR_NOT_SUPPORTED | GapAdvertisingData::LE_GENERAL_DISCOVERABLE);
alexanderlea 14:7225b50aaaf7 118 ble.accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LIST_16BIT_SERVICE_IDS, (uint8_t *)uuid16_list, sizeof(uuid16_list));
alexanderlea 0:af868ad47854 119 ble.accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LOCAL_NAME, (uint8_t *)DEVICE_NAME, sizeof(DEVICE_NAME));
alexanderlea 0:af868ad47854 120 ble.setAdvertisingType(GapAdvertisingParams::ADV_CONNECTABLE_UNDIRECTED);
alexanderlea 11:35b63ab4c76c 121
alexanderlea 14:7225b50aaaf7 122 ble.setAdvertisingInterval(1600); /* 1s; in multiples of 0.625ms. */
alexanderlea 0:af868ad47854 123 ble.startAdvertising();
alexanderlea 0:af868ad47854 124
alexanderlea 0:af868ad47854 125 pc.printf("Advertising node %s\n\r", DEVICE_NAME);
alexanderlea 0:af868ad47854 126
alexanderlea 11:35b63ab4c76c 127 //loop forever
alexanderlea 0:af868ad47854 128 while(true) {
alexanderlea 12:f5b12e8b6043 129 ble.waitForEvent(); // this should return upon any system event (such as an interrupt or a ticker wakeup)
alexanderlea 11:35b63ab4c76c 130
alexanderlea 16:d821122547b3 131 /*if(indicatorOn) { //if button is pressed
alexanderlea 11:35b63ab4c76c 132 if(!indicatorSent) { //should only fire the first time!
alexanderlea 14:7225b50aaaf7 133 pc.printf("Command on\r\n");
alexanderlea 16:d821122547b3 134 broadcasterService->sendCommand(cmdIndicatorOn);
alexanderlea 11:35b63ab4c76c 135 indicatorSent = true; //set true to stop multiple firing
alexanderlea 11:35b63ab4c76c 136 }
alexanderlea 11:35b63ab4c76c 137 } else {
alexanderlea 11:35b63ab4c76c 138 if(!indicatorSent) {
alexanderlea 14:7225b50aaaf7 139 pc.printf("Command off\r\n");
alexanderlea 16:d821122547b3 140 broadcasterService->sendCommand(cmdIndicatorOff);
alexanderlea 11:35b63ab4c76c 141 indicatorSent = true; //set true to stop multiple firing
alexanderlea 5:b3f8e10b9602 142 }
alexanderlea 16:d821122547b3 143 }*/
alexanderlea 0:af868ad47854 144 }
alexanderlea 0:af868ad47854 145 }