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:59:00 2015 +0000
Revision:
17:df2f1d5c69a8
Parent:
16:d821122547b3
Child:
18:867625bb5000
Tidied up code a load

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