Example for Bluetooth low energy interface

Dependencies:   mbed HC_SR04_Ultrasonic_Library

Committer:
julientiron
Date:
Tue May 19 20:42:25 2015 +0000
Revision:
3:829f081fde15
Parent:
2:b5166e24c7a6
hihi;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
julientiron 0:3d641e170a74 1 #include "mbed.h"
julientiron 2:b5166e24c7a6 2 #include "ultrasonic.h"
julientiron 0:3d641e170a74 3
julientiron 0:3d641e170a74 4 DigitalOut myled(LED1);
julientiron 0:3d641e170a74 5
julientiron 0:3d641e170a74 6 #include "debug.h"
julientiron 0:3d641e170a74 7 #include "btle.h"
julientiron 0:3d641e170a74 8 //#include "BlueNRGDevice.h"//User does not use any platform specific header file
julientiron 0:3d641e170a74 9 #include "BLEDevice.h"
julientiron 0:3d641e170a74 10 #include "UUID.h"
julientiron 0:3d641e170a74 11 #include "Utils.h"
julientiron 0:3d641e170a74 12
julientiron 0:3d641e170a74 13 BLEDevice dev;
julientiron 0:3d641e170a74 14
julientiron 2:b5166e24c7a6 15 const static char DEVICE_NAME[] = "FearInProgress";
julientiron 2:b5166e24c7a6 16 const uint8_t device_address[6] = { 0x07, 0x07, 0x07, 0x07, 0x07, 0x07 }; //Peripheral address
julientiron 2:b5166e24c7a6 17 //InterruptIn event_button(USER_BUTTON);
julientiron 0:3d641e170a74 18 volatile bool go_to_sleep = true;
julientiron 0:3d641e170a74 19
julientiron 2:b5166e24c7a6 20 #define MAX_SERVICES_NOS 1
julientiron 2:b5166e24c7a6 21
julientiron 3:829f081fde15 22
julientiron 3:829f081fde15 23 static uint8_t mm[2] = {0x00, 0x00};
julientiron 3:829f081fde15 24 static uint8_t upd[2] = {0x00, 0x00};
julientiron 0:3d641e170a74 25
julientiron 2:b5166e24c7a6 26 GattCharacteristic proxLevel(GattCharacteristic::UUID_ALERT_LEVEL_CHAR, mm, sizeof(mm), sizeof(mm),
julientiron 0:3d641e170a74 27 GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_NOTIFY|GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_READ
julientiron 0:3d641e170a74 28 /*GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_INDICATE*/);
julientiron 0:3d641e170a74 29
julientiron 2:b5166e24c7a6 30 GattCharacteristic updateRate(GattCharacteristic::UUID_MEASUREMENT_INTERVAL_CHAR , upd, sizeof(upd), sizeof(upd),
julientiron 0:3d641e170a74 31 GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_WRITE_WITHOUT_RESPONSE|
julientiron 0:3d641e170a74 32 GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_WRITE|GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_READ);
julientiron 0:3d641e170a74 33
julientiron 2:b5166e24c7a6 34 GattCharacteristic *proxChars[] = {&proxLevel, &updateRate };
julientiron 2:b5166e24c7a6 35 //UUID PROXSERVICE(GattService::UUID_IMMEDIATE_ALERT_SERVICE);
julientiron 2:b5166e24c7a6 36 GattService proxService(GattService::UUID_IMMEDIATE_ALERT_SERVICE, proxChars, sizeof(proxChars) / sizeof(GattCharacteristic *));
julientiron 0:3d641e170a74 37
julientiron 2:b5166e24c7a6 38 static const uint16_t uuid16_list[] = {GattService::UUID_IMMEDIATE_ALERT_SERVICE};
julientiron 2:b5166e24c7a6 39
julientiron 2:b5166e24c7a6 40 void dist(int distance)
julientiron 2:b5166e24c7a6 41 {
julientiron 3:829f081fde15 42 //if (dev.getGapState().connected) {
julientiron 3:829f081fde15 43 mm[0] = distance & 0xff;
julientiron 3:829f081fde15 44 mm[1] = (distance >> 8);
julientiron 3:829f081fde15 45 dev.updateCharacteristicValue(proxLevel.getHandle(), mm, sizeof(mm));
julientiron 3:829f081fde15 46 //}
julientiron 3:829f081fde15 47 DEBUG("%d%d Distance changed to %dmm\r\n", mm[1], mm[0], distance);
julientiron 2:b5166e24c7a6 48 }
julientiron 0:3d641e170a74 49
julientiron 0:3d641e170a74 50 void ISR_pressed() // ISR for the button press
julientiron 0:3d641e170a74 51 {
julientiron 2:b5166e24c7a6 52 DEBUG("Button pressed\n"); // Show that the button has pressed
julientiron 0:3d641e170a74 53 go_to_sleep = !go_to_sleep; // Toogle the sleep state
julientiron 2:b5166e24c7a6 54 //mu.checkDistance();
julientiron 2:b5166e24c7a6 55 //event_button.disable_irq(); // Disable the interrupt request
julientiron 0:3d641e170a74 56 }
julientiron 0:3d641e170a74 57
julientiron 0:3d641e170a74 58 void disconnectionCallback(uint16_t Handle_t)
julientiron 0:3d641e170a74 59 {
julientiron 0:3d641e170a74 60 DEBUG("Disconnected!\n\r");
julientiron 0:3d641e170a74 61 DEBUG("Restarting the advertising process\n\r");
julientiron 0:3d641e170a74 62 dev.startAdvertising();
julientiron 0:3d641e170a74 63 }
julientiron 0:3d641e170a74 64
julientiron 0:3d641e170a74 65 void onWriteCallback(uint16_t attributeHandle) {
julientiron 0:3d641e170a74 66 DEBUG("Write Callback!!\n\r");
julientiron 0:3d641e170a74 67 }
julientiron 0:3d641e170a74 68
julientiron 0:3d641e170a74 69 void onConnectionCallback(uint16_t Handle_t) {
julientiron 0:3d641e170a74 70 //myled = 1; // LED is ON
julientiron 0:3d641e170a74 71 DEBUG("Connected BlueNRG!!\n\r");
julientiron 0:3d641e170a74 72 }
julientiron 0:3d641e170a74 73
julientiron 0:3d641e170a74 74
julientiron 0:3d641e170a74 75 void onNotifyEnabled(uint16_t charHandle) {
julientiron 0:3d641e170a74 76 //myled = 1; // LED is ON
julientiron 0:3d641e170a74 77 DEBUG("onNotifyEnabled!!\n\r");
julientiron 0:3d641e170a74 78 }
julientiron 0:3d641e170a74 79
julientiron 0:3d641e170a74 80 void onNotifyDisabled(uint16_t charHandle) {
julientiron 0:3d641e170a74 81 //myled = 1; // LED is ON
julientiron 0:3d641e170a74 82 DEBUG("onNotifyDisabled!!\n\r");
julientiron 0:3d641e170a74 83 }
julientiron 0:3d641e170a74 84
julientiron 0:3d641e170a74 85 void onDataSentNotify() {
julientiron 0:3d641e170a74 86 //myled = 1; // LED is ON
julientiron 0:3d641e170a74 87 DEBUG("on Data Sent Notify!!\n\r");
julientiron 0:3d641e170a74 88 }
julientiron 0:3d641e170a74 89
julientiron 0:3d641e170a74 90
julientiron 0:3d641e170a74 91 /**
julientiron 0:3d641e170a74 92 * Triggered periodically by the 'ticker' interrupt; updates hrmCounter.
julientiron 0:3d641e170a74 93 */
julientiron 3:829f081fde15 94 void periodicCallback()
julientiron 0:3d641e170a74 95 {
julientiron 0:3d641e170a74 96 }
julientiron 0:3d641e170a74 97
julientiron 0:3d641e170a74 98 int main() {
julientiron 0:3d641e170a74 99
julientiron 2:b5166e24c7a6 100 //Ticker ticker; //For Tick interrupt if used later on (periodic data updates?)
julientiron 2:b5166e24c7a6 101 //event_button.mode(PullUp); // Setup the internall pull-up resistor
julientiron 2:b5166e24c7a6 102 //event_button.fall(&ISR_pressed); // Set the ISR associated to event fall (push the button)
julientiron 2:b5166e24c7a6 103 //ticker.attach(periodicCallback, 1);
julientiron 2:b5166e24c7a6 104
julientiron 0:3d641e170a74 105 myled = 0;//Switch OFF LED1
julientiron 0:3d641e170a74 106
julientiron 0:3d641e170a74 107 DEBUG("Initializing BlueNRG...\n\r");
julientiron 0:3d641e170a74 108 dev.init();
julientiron 0:3d641e170a74 109
julientiron 0:3d641e170a74 110 dev.onConnection(onConnectionCallback);
julientiron 0:3d641e170a74 111 dev.onDisconnection(disconnectionCallback);
julientiron 0:3d641e170a74 112 dev.onDataWritten(onWriteCallback);
julientiron 0:3d641e170a74 113 dev.onUpdatesEnabled(onNotifyEnabled);
julientiron 0:3d641e170a74 114 dev.onDataSent(onDataSentNotify);
julientiron 0:3d641e170a74 115 dev.onUpdatesDisabled(onNotifyDisabled);
julientiron 0:3d641e170a74 116
julientiron 0:3d641e170a74 117 dev.setAddress(Gap::ADDR_TYPE_PUBLIC, device_address);//Will reset the device and re-init()
julientiron 2:b5166e24c7a6 118
julientiron 0:3d641e170a74 119 /* setup advertising */
julientiron 0:3d641e170a74 120 dev.accumulateAdvertisingPayload(GapAdvertisingData::BREDR_NOT_SUPPORTED | GapAdvertisingData::LE_GENERAL_DISCOVERABLE);
julientiron 0:3d641e170a74 121 dev.accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LIST_16BIT_SERVICE_IDS, (uint8_t*)uuid16_list, sizeof(uuid16_list));
julientiron 0:3d641e170a74 122 dev.accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LOCAL_NAME, (uint8_t *)DEVICE_NAME, sizeof(DEVICE_NAME));
julientiron 0:3d641e170a74 123 dev.setAdvertisingType(GapAdvertisingParams::ADV_CONNECTABLE_UNDIRECTED);
julientiron 0:3d641e170a74 124 dev.setAdvertisingInterval(160); /* 100ms; in multiples of 0.625ms. */
julientiron 0:3d641e170a74 125 DEBUG("Starting Advertising...\n\r");
julientiron 0:3d641e170a74 126 dev.startAdvertising();
julientiron 2:b5166e24c7a6 127 dev.addService(proxService);
julientiron 3:829f081fde15 128 ultrasonic mu(D8, D9, .1, 1, &dist);
julientiron 2:b5166e24c7a6 129 mu.startUpdates();
julientiron 0:3d641e170a74 130
julientiron 0:3d641e170a74 131 while(1) {
julientiron 2:b5166e24c7a6 132 /*
julientiron 0:3d641e170a74 133 if(go_to_sleep)
julientiron 0:3d641e170a74 134 {
julientiron 0:3d641e170a74 135 myled = 0;
julientiron 0:3d641e170a74 136 event_button.enable_irq(); // Enable the interrupt request
julientiron 0:3d641e170a74 137 //sleep(); // Enter Low Power Mode
julientiron 0:3d641e170a74 138 deepsleep(); // Enter Low Power Mode (deep)
julientiron 0:3d641e170a74 139 wait_ms(200); // Wait 200ms for debounce
julientiron 0:3d641e170a74 140 event_button.enable_irq(); // Enable the interrupt request
julientiron 2:b5166e24c7a6 141 }*/
julientiron 2:b5166e24c7a6 142 //else
julientiron 2:b5166e24c7a6 143 mu.checkDistance();
julientiron 0:3d641e170a74 144 myled = 1;
julientiron 2:b5166e24c7a6 145 wait(1);
julientiron 0:3d641e170a74 146 periodicCallback();//Works from here!!
julientiron 0:3d641e170a74 147 dev.waitForEvent();
julientiron 0:3d641e170a74 148 }
julientiron 0:3d641e170a74 149 }