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:
Sat Apr 25 12:56:07 2015 +0000
Revision:
20:288064697dd3
Parent:
18:867625bb5000
Child:
21:84574bea5494
Altered to screen logging and removed ref to error service

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