Alexander Lea / Mbed 2 deprecated BLE_CarPeripheral

Dependencies:   BLE_API mbed nRF51822

Fork of BLE_GATT_test1 by Alexander Lea

Committer:
alexanderlea
Date:
Thu Mar 26 15:06:21 2015 +0000
Revision:
11:35b63ab4c76c
Parent:
10:2c5c202c69a5
Child:
12:f5b12e8b6043
Properly working with input from physical switch

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 11:35b63ab4c76c 5 #include "PinDetect.h"
alexanderlea 0:af868ad47854 6 #include <string>
alexanderlea 0:af868ad47854 7
alexanderlea 0:af868ad47854 8 using namespace std;
alexanderlea 0:af868ad47854 9
alexanderlea 0:af868ad47854 10 BLEDevice ble;
alexanderlea 0:af868ad47854 11 DigitalOut led1(LED1);
alexanderlea 11:35b63ab4c76c 12
alexanderlea 11:35b63ab4c76c 13 PinDetect pIn(p5);
alexanderlea 11:35b63ab4c76c 14
alexanderlea 0:af868ad47854 15 Serial pc(USBTX, USBRX);
alexanderlea 0:af868ad47854 16
alexanderlea 0:af868ad47854 17 /*Variable Declarations*/
alexanderlea 3:f3d20b36b7ea 18 const static char DEVICE_NAME[] = "BLE_Broadcaster";
alexanderlea 0:af868ad47854 19
alexanderlea 11:35b63ab4c76c 20 static volatile bool indicatorOn = false;
alexanderlea 11:35b63ab4c76c 21 static volatile bool indicatorSent = false;
alexanderlea 11:35b63ab4c76c 22 //TODO: I want to be able to send something like:
alexanderlea 11:35b63ab4c76c 23
alexanderlea 11:35b63ab4c76c 24 //with first 4 bits being type code, and last 4 being command, or something
alexanderlea 11:35b63ab4c76c 25 uint8_t cmdOn[8] = { 0x4d,0x32,0x81,0xc0,0x4d,0x4d,0x4d,0x4d };
alexanderlea 11:35b63ab4c76c 26 uint8_t cmdOff[8] = { 0x4d,0x32,0x81,0xc0,0x00,0x00,0x00,0x00 };
alexanderlea 11:35b63ab4c76c 27
alexanderlea 0:af868ad47854 28 void blink(void)
alexanderlea 0:af868ad47854 29 {
alexanderlea 11:35b63ab4c76c 30 led1 = !led1; /* Do blinky on LED1 while we're waiting for BLE events */
alexanderlea 11:35b63ab4c76c 31 }
alexanderlea 5:b3f8e10b9602 32
alexanderlea 11:35b63ab4c76c 33 /** Callback routine is interrupt activated by a debounced pb hit*/
alexanderlea 11:35b63ab4c76c 34 void keyPressed(void) {
alexanderlea 11:35b63ab4c76c 35 indicatorOn = true;
alexanderlea 11:35b63ab4c76c 36 indicatorSent = false;
alexanderlea 11:35b63ab4c76c 37 pc.printf("Switch changed. Is now %d \r\n", indicatorOn);
alexanderlea 11:35b63ab4c76c 38 }
alexanderlea 11:35b63ab4c76c 39
alexanderlea 11:35b63ab4c76c 40 void keyReleased(void) {
alexanderlea 11:35b63ab4c76c 41 indicatorOn = false;
alexanderlea 11:35b63ab4c76c 42 indicatorSent = false;
alexanderlea 11:35b63ab4c76c 43 pc.printf("Switch changed. Is now %d \r\n", indicatorOn);
alexanderlea 0:af868ad47854 44 }
alexanderlea 0:af868ad47854 45
alexanderlea 0:af868ad47854 46 void disconnectionCallback(Gap::Handle_t handle, Gap::DisconnectionReason_t reason)
alexanderlea 0:af868ad47854 47 {
alexanderlea 0:af868ad47854 48 pc.printf("Disconnected! - start advertising. Handle:%d, Reason:0x%02x\r\n", handle, reason);
alexanderlea 0:af868ad47854 49 ble.startAdvertising();
alexanderlea 0:af868ad47854 50 }
alexanderlea 0:af868ad47854 51
alexanderlea 0:af868ad47854 52 void connectionCallback(Gap::Handle_t handle, Gap::addr_type_t peerAddrType, const Gap::address_t peerAddr, const Gap::ConnectionParams_t *parms)
alexanderlea 0:af868ad47854 53 {
alexanderlea 0:af868ad47854 54 pc.printf("Connected! - stop advertising. Handle:%d, eType:%d, Add:%u.\r\n", handle, peerAddrType, peerAddr);
alexanderlea 3:f3d20b36b7ea 55 ble.stopAdvertising();
alexanderlea 0:af868ad47854 56 }
alexanderlea 0:af868ad47854 57
alexanderlea 0:af868ad47854 58 int main(void)
alexanderlea 4:ac0ee88ea0ed 59 {
alexanderlea 11:35b63ab4c76c 60 /*Setup switch input*/
alexanderlea 11:35b63ab4c76c 61 pIn.mode(PullUp);
alexanderlea 11:35b63ab4c76c 62 // Delay for initial pullup to take effect
alexanderlea 11:35b63ab4c76c 63 wait(.01);
alexanderlea 11:35b63ab4c76c 64
alexanderlea 11:35b63ab4c76c 65 //set asserted = 0 volts and deasserted = 5 (or 3.3, actually)
alexanderlea 11:35b63ab4c76c 66 pIn.setAssertValue(0);
alexanderlea 11:35b63ab4c76c 67 // Setup Interrupt callback function for a pb hit
alexanderlea 11:35b63ab4c76c 68 pIn.attach_asserted( &keyPressed );
alexanderlea 11:35b63ab4c76c 69 pIn.attach_deasserted( &keyReleased );
alexanderlea 11:35b63ab4c76c 70
alexanderlea 11:35b63ab4c76c 71 // Start sampling pb input using interrupts
alexanderlea 11:35b63ab4c76c 72 pIn.setSampleFrequency();
alexanderlea 11:35b63ab4c76c 73
alexanderlea 11:35b63ab4c76c 74 /*Setup Blinky*/
alexanderlea 11:35b63ab4c76c 75 //led1 = 1;
alexanderlea 11:35b63ab4c76c 76 //Ticker t;
alexanderlea 11:35b63ab4c76c 77 //t.attach(blink, 1f);
alexanderlea 4:ac0ee88ea0ed 78
alexanderlea 11:35b63ab4c76c 79 /*Setup BLE*/
alexanderlea 0:af868ad47854 80 ble.init();
alexanderlea 0:af868ad47854 81 ble.onDisconnection(disconnectionCallback);
alexanderlea 0:af868ad47854 82 ble.onConnection(connectionCallback);
alexanderlea 0:af868ad47854 83
alexanderlea 11:35b63ab4c76c 84 //create services
alexanderlea 9:0ed64b14d46b 85 BroadcasterService broadcasterService(ble);
alexanderlea 10:2c5c202c69a5 86 ErrorService errorService(ble);
alexanderlea 4:ac0ee88ea0ed 87
alexanderlea 0:af868ad47854 88 /*
alexanderlea 0:af868ad47854 89 **BREDR_NOT_SUPPORTED = BLE only
alexanderlea 0:af868ad47854 90 **LE_GENERAL_DISCOVERABLE = Device is discoverable at any moment (no time out)
alexanderlea 0:af868ad47854 91 **ADV_CONNECTABLE_UNDIRECTED = Any central device can connect
alexanderlea 0:af868ad47854 92 */
alexanderlea 0:af868ad47854 93 ble.accumulateAdvertisingPayload(GapAdvertisingData::BREDR_NOT_SUPPORTED | GapAdvertisingData::LE_GENERAL_DISCOVERABLE);
alexanderlea 0:af868ad47854 94 // ble.accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LIST_16BIT_SERVICE_IDS, (uint8_t *)uuid16_list, sizeof(uuid16_list));
alexanderlea 0:af868ad47854 95 ble.accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LOCAL_NAME, (uint8_t *)DEVICE_NAME, sizeof(DEVICE_NAME));
alexanderlea 0:af868ad47854 96 ble.setAdvertisingType(GapAdvertisingParams::ADV_CONNECTABLE_UNDIRECTED);
alexanderlea 11:35b63ab4c76c 97
alexanderlea 0:af868ad47854 98 ble.setAdvertisingInterval(160); /* 1s; in multiples of 0.625ms. */ //was 1600
alexanderlea 0:af868ad47854 99 ble.startAdvertising();
alexanderlea 0:af868ad47854 100
alexanderlea 0:af868ad47854 101 pc.printf("Advertising node %s\n\r", DEVICE_NAME);
alexanderlea 0:af868ad47854 102
alexanderlea 11:35b63ab4c76c 103 //loop forever
alexanderlea 0:af868ad47854 104 while(true) {
alexanderlea 0:af868ad47854 105
alexanderlea 11:35b63ab4c76c 106 ble.waitForEvent(); // this will return upon any system event (such as an interrupt or a ticker wakeup)
alexanderlea 11:35b63ab4c76c 107
alexanderlea 11:35b63ab4c76c 108 if(indicatorOn) { //if button is pressed
alexanderlea 11:35b63ab4c76c 109 if(!indicatorSent) { //should only fire the first time!
alexanderlea 11:35b63ab4c76c 110 pc.printf("Command on = %u\r\n", cmdOn);
alexanderlea 5:b3f8e10b9602 111 broadcasterService.sendCommand(cmdOn);
alexanderlea 11:35b63ab4c76c 112 led1 = true;
alexanderlea 11:35b63ab4c76c 113 //errorService.registerError(ErrorService::ERROR_GENERIC);
alexanderlea 11:35b63ab4c76c 114 indicatorSent = true; //set true to stop multiple firing
alexanderlea 11:35b63ab4c76c 115 }
alexanderlea 11:35b63ab4c76c 116 } else {
alexanderlea 11:35b63ab4c76c 117 if(!indicatorSent) {
alexanderlea 11:35b63ab4c76c 118 pc.printf("Command off = %u\r\n", cmdOff);
alexanderlea 5:b3f8e10b9602 119 broadcasterService.sendCommand(cmdOff);
alexanderlea 11:35b63ab4c76c 120 led1 = false;
alexanderlea 11:35b63ab4c76c 121 //errorService.registerError(ErrorService::ERROR_DISCONNECTION);
alexanderlea 11:35b63ab4c76c 122 indicatorSent = true; //set true to stop multiple firing
alexanderlea 5:b3f8e10b9602 123 }
alexanderlea 0:af868ad47854 124 }
alexanderlea 0:af868ad47854 125 }
alexanderlea 0:af868ad47854 126 }