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:
Tue Apr 14 15:57:47 2015 +0000
Revision:
15:ad1d37e51a26
Parent:
14:7225b50aaaf7
Child:
16:d821122547b3
Incorporated error characteristic as part of broadcaster 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 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 14:7225b50aaaf7 18 uint8_t cmdIndicatorOn[8] = { 0x69,0x6e,0x64,0x69,0xff,0xff,0xff,0xff }; // = I N D I 255 255 255 255
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 14:7225b50aaaf7 20 static const uint16_t uuid16_list[] = {BroadcasterService::BROADCAST_SERVICE_UUID};
alexanderlea 12:f5b12e8b6043 21
alexanderlea 12:f5b12e8b6043 22 /** Callback function for ticker */
alexanderlea 0:af868ad47854 23 void blink(void)
alexanderlea 0:af868ad47854 24 {
alexanderlea 12:f5b12e8b6043 25 led1 = !led1; /* Do blinky on LED1 while we're waiting for BLE events */
alexanderlea 11:35b63ab4c76c 26 }
alexanderlea 5:b3f8e10b9602 27
alexanderlea 12:f5b12e8b6043 28 /** Callback routine is interrupt activated by a debounced button hit*/
alexanderlea 13:a578c382cb7d 29 void indicatorSwitchOn(void) {
alexanderlea 11:35b63ab4c76c 30 indicatorOn = true;
alexanderlea 11:35b63ab4c76c 31 indicatorSent = false;
alexanderlea 13:a578c382cb7d 32 pc.printf("Indicator switch on.\r\n");
alexanderlea 11:35b63ab4c76c 33 }
alexanderlea 11:35b63ab4c76c 34
alexanderlea 13:a578c382cb7d 35 /** Callback routine is interrupt activated by a debounced button release*/
alexanderlea 13:a578c382cb7d 36 void indicatorSwitchOff(void) {
alexanderlea 11:35b63ab4c76c 37 indicatorOn = false;
alexanderlea 11:35b63ab4c76c 38 indicatorSent = false;
alexanderlea 13:a578c382cb7d 39 pc.printf("Indicator switch off.\r\n");
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 14:7225b50aaaf7 52 pc.printf("Connected! - stop advertising. Handle:%d, eType:%d, Addr:%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 13:a578c382cb7d 63 indicatorIn.fall(&indicatorSwitchOn);
alexanderlea 13:a578c382cb7d 64 indicatorIn.rise(&indicatorSwitchOff);
alexanderlea 11:35b63ab4c76c 65
alexanderlea 14:7225b50aaaf7 66 //TODO: Initial light input - if switch is ON at program start
alexanderlea 14:7225b50aaaf7 67
alexanderlea 11:35b63ab4c76c 68 /*Setup Blinky*/
alexanderlea 12:f5b12e8b6043 69 led1 = 1;
alexanderlea 12:f5b12e8b6043 70 Ticker t;
alexanderlea 12:f5b12e8b6043 71 t.attach(&blink, 1);
alexanderlea 4:ac0ee88ea0ed 72
alexanderlea 11:35b63ab4c76c 73 /*Setup BLE*/
alexanderlea 0:af868ad47854 74 ble.init();
alexanderlea 0:af868ad47854 75 ble.onDisconnection(disconnectionCallback);
alexanderlea 0:af868ad47854 76 ble.onConnection(connectionCallback);
alexanderlea 0:af868ad47854 77
alexanderlea 11:35b63ab4c76c 78 //create services
alexanderlea 9:0ed64b14d46b 79 BroadcasterService broadcasterService(ble);
alexanderlea 4:ac0ee88ea0ed 80
alexanderlea 0:af868ad47854 81 /*
alexanderlea 13:a578c382cb7d 82 * BREDR_NOT_SUPPORTED = BLE only
alexanderlea 13:a578c382cb7d 83 * LE_GENERAL_DISCOVERABLE = Device is discoverable at any moment (no time out)
alexanderlea 13:a578c382cb7d 84 * ADV_CONNECTABLE_UNDIRECTED = Any central device can connect
alexanderlea 0:af868ad47854 85 */
alexanderlea 0:af868ad47854 86 ble.accumulateAdvertisingPayload(GapAdvertisingData::BREDR_NOT_SUPPORTED | GapAdvertisingData::LE_GENERAL_DISCOVERABLE);
alexanderlea 14:7225b50aaaf7 87 ble.accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LIST_16BIT_SERVICE_IDS, (uint8_t *)uuid16_list, sizeof(uuid16_list));
alexanderlea 0:af868ad47854 88 ble.accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LOCAL_NAME, (uint8_t *)DEVICE_NAME, sizeof(DEVICE_NAME));
alexanderlea 0:af868ad47854 89 ble.setAdvertisingType(GapAdvertisingParams::ADV_CONNECTABLE_UNDIRECTED);
alexanderlea 11:35b63ab4c76c 90
alexanderlea 14:7225b50aaaf7 91 ble.setAdvertisingInterval(1600); /* 1s; in multiples of 0.625ms. */
alexanderlea 0:af868ad47854 92 ble.startAdvertising();
alexanderlea 0:af868ad47854 93
alexanderlea 0:af868ad47854 94 pc.printf("Advertising node %s\n\r", DEVICE_NAME);
alexanderlea 0:af868ad47854 95
alexanderlea 11:35b63ab4c76c 96 //loop forever
alexanderlea 0:af868ad47854 97 while(true) {
alexanderlea 12:f5b12e8b6043 98 ble.waitForEvent(); // this should return upon any system event (such as an interrupt or a ticker wakeup)
alexanderlea 11:35b63ab4c76c 99
alexanderlea 11:35b63ab4c76c 100 if(indicatorOn) { //if button is pressed
alexanderlea 11:35b63ab4c76c 101 if(!indicatorSent) { //should only fire the first time!
alexanderlea 14:7225b50aaaf7 102 pc.printf("Command on\r\n");
alexanderlea 13:a578c382cb7d 103 broadcasterService.sendCommand(cmdIndicatorOn);
alexanderlea 11:35b63ab4c76c 104 indicatorSent = true; //set true to stop multiple firing
alexanderlea 11:35b63ab4c76c 105 }
alexanderlea 11:35b63ab4c76c 106 } else {
alexanderlea 11:35b63ab4c76c 107 if(!indicatorSent) {
alexanderlea 14:7225b50aaaf7 108 pc.printf("Command off\r\n");
alexanderlea 13:a578c382cb7d 109 broadcasterService.sendCommand(cmdIndicatorOff);
alexanderlea 11:35b63ab4c76c 110 indicatorSent = true; //set true to stop multiple firing
alexanderlea 5:b3f8e10b9602 111 }
alexanderlea 0:af868ad47854 112 }
alexanderlea 0:af868ad47854 113 }
alexanderlea 0:af868ad47854 114 }