ble

Dependencies:   HC_SR04_Ultrasonic_Library Servo mbed

Fork of FIP_REV1 by Robotique FIP

Committer:
julientiron
Date:
Thu Jul 09 13:33:36 2015 +0000
Revision:
4:69a35a56ac48
Parent:
3:829f081fde15
BLE

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 4:69a35a56ac48 3 #include "Servo.h"
julientiron 0:3d641e170a74 4 #include "debug.h"
julientiron 0:3d641e170a74 5 #include "btle.h"
julientiron 0:3d641e170a74 6 //#include "BlueNRGDevice.h"//User does not use any platform specific header file
julientiron 0:3d641e170a74 7 #include "BLEDevice.h"
julientiron 0:3d641e170a74 8 #include "UUID.h"
julientiron 0:3d641e170a74 9 #include "Utils.h"
julientiron 4:69a35a56ac48 10
julientiron 0:3d641e170a74 11 BLEDevice dev;
julientiron 4:69a35a56ac48 12 DigitalOut myled(LED1);
julientiron 4:69a35a56ac48 13 Servo servo1(D15);
julientiron 4:69a35a56ac48 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 4:69a35a56ac48 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 4:69a35a56ac48 25
julientiron 4:69a35a56ac48 26 GattCharacteristic proxLevel(GattCharacteristic::UUID_ALERT_LEVEL_CHAR, mm, sizeof(mm), sizeof(mm),
julientiron 4:69a35a56ac48 27 GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_NOTIFY|GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_READ
julientiron 4:69a35a56ac48 28 /*GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_INDICATE*/);
julientiron 4:69a35a56ac48 29
julientiron 4:69a35a56ac48 30 GattCharacteristic updateRate(GattCharacteristic::UUID_MEASUREMENT_INTERVAL_CHAR , upd, sizeof(upd), sizeof(upd),
julientiron 4:69a35a56ac48 31 GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_WRITE_WITHOUT_RESPONSE|
julientiron 4:69a35a56ac48 32 GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_WRITE|GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_READ);
julientiron 4:69a35a56ac48 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 4:69a35a56ac48 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 4:69a35a56ac48 64
julientiron 4:69a35a56ac48 65 void onWriteCallback(uint16_t attributeHandle)
julientiron 4:69a35a56ac48 66 {
julientiron 4:69a35a56ac48 67 if(attributeHandle == updateRate.getHandle()){
julientiron 4:69a35a56ac48 68 servo1.write(upd[0]);
julientiron 0:3d641e170a74 69 }
julientiron 4:69a35a56ac48 70 DEBUG("Write Callback!! %d %d \n\r", attributeHandle, updateRate.getHandle());
julientiron 4:69a35a56ac48 71
julientiron 4:69a35a56ac48 72 }
julientiron 4:69a35a56ac48 73
julientiron 0:3d641e170a74 74 void onConnectionCallback(uint16_t Handle_t) {
julientiron 0:3d641e170a74 75 //myled = 1; // LED is ON
julientiron 0:3d641e170a74 76 DEBUG("Connected BlueNRG!!\n\r");
julientiron 0:3d641e170a74 77 }
julientiron 0:3d641e170a74 78
julientiron 0:3d641e170a74 79
julientiron 0:3d641e170a74 80 void onNotifyEnabled(uint16_t charHandle) {
julientiron 0:3d641e170a74 81 //myled = 1; // LED is ON
julientiron 0:3d641e170a74 82 DEBUG("onNotifyEnabled!!\n\r");
julientiron 0:3d641e170a74 83 }
julientiron 0:3d641e170a74 84
julientiron 0:3d641e170a74 85 void onNotifyDisabled(uint16_t charHandle) {
julientiron 0:3d641e170a74 86 //myled = 1; // LED is ON
julientiron 0:3d641e170a74 87 DEBUG("onNotifyDisabled!!\n\r");
julientiron 0:3d641e170a74 88 }
julientiron 0:3d641e170a74 89
julientiron 0:3d641e170a74 90 void onDataSentNotify() {
julientiron 0:3d641e170a74 91 //myled = 1; // LED is ON
julientiron 0:3d641e170a74 92 DEBUG("on Data Sent Notify!!\n\r");
julientiron 0:3d641e170a74 93 }
julientiron 0:3d641e170a74 94
julientiron 0:3d641e170a74 95
julientiron 0:3d641e170a74 96 /**
julientiron 0:3d641e170a74 97 * Triggered periodically by the 'ticker' interrupt; updates hrmCounter.
julientiron 0:3d641e170a74 98 */
julientiron 3:829f081fde15 99 void periodicCallback()
julientiron 0:3d641e170a74 100 {
julientiron 0:3d641e170a74 101 }
julientiron 0:3d641e170a74 102
julientiron 0:3d641e170a74 103 int main() {
julientiron 0:3d641e170a74 104
julientiron 2:b5166e24c7a6 105 //Ticker ticker; //For Tick interrupt if used later on (periodic data updates?)
julientiron 2:b5166e24c7a6 106 //event_button.mode(PullUp); // Setup the internall pull-up resistor
julientiron 2:b5166e24c7a6 107 //event_button.fall(&ISR_pressed); // Set the ISR associated to event fall (push the button)
julientiron 2:b5166e24c7a6 108 //ticker.attach(periodicCallback, 1);
julientiron 2:b5166e24c7a6 109
julientiron 0:3d641e170a74 110 myled = 0;//Switch OFF LED1
julientiron 0:3d641e170a74 111
julientiron 0:3d641e170a74 112 DEBUG("Initializing BlueNRG...\n\r");
julientiron 0:3d641e170a74 113 dev.init();
julientiron 0:3d641e170a74 114
julientiron 0:3d641e170a74 115 dev.onConnection(onConnectionCallback);
julientiron 0:3d641e170a74 116 dev.onDisconnection(disconnectionCallback);
julientiron 0:3d641e170a74 117 dev.onDataWritten(onWriteCallback);
julientiron 0:3d641e170a74 118 dev.onUpdatesEnabled(onNotifyEnabled);
julientiron 0:3d641e170a74 119 dev.onDataSent(onDataSentNotify);
julientiron 0:3d641e170a74 120 dev.onUpdatesDisabled(onNotifyDisabled);
julientiron 0:3d641e170a74 121
julientiron 0:3d641e170a74 122 dev.setAddress(Gap::ADDR_TYPE_PUBLIC, device_address);//Will reset the device and re-init()
julientiron 2:b5166e24c7a6 123
julientiron 0:3d641e170a74 124 /* setup advertising */
julientiron 0:3d641e170a74 125 dev.accumulateAdvertisingPayload(GapAdvertisingData::BREDR_NOT_SUPPORTED | GapAdvertisingData::LE_GENERAL_DISCOVERABLE);
julientiron 0:3d641e170a74 126 dev.accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LIST_16BIT_SERVICE_IDS, (uint8_t*)uuid16_list, sizeof(uuid16_list));
julientiron 0:3d641e170a74 127 dev.accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LOCAL_NAME, (uint8_t *)DEVICE_NAME, sizeof(DEVICE_NAME));
julientiron 0:3d641e170a74 128 dev.setAdvertisingType(GapAdvertisingParams::ADV_CONNECTABLE_UNDIRECTED);
julientiron 0:3d641e170a74 129 dev.setAdvertisingInterval(160); /* 100ms; in multiples of 0.625ms. */
julientiron 0:3d641e170a74 130 DEBUG("Starting Advertising...\n\r");
julientiron 0:3d641e170a74 131 dev.startAdvertising();
julientiron 2:b5166e24c7a6 132 dev.addService(proxService);
julientiron 3:829f081fde15 133 ultrasonic mu(D8, D9, .1, 1, &dist);
julientiron 2:b5166e24c7a6 134 mu.startUpdates();
julientiron 0:3d641e170a74 135
julientiron 0:3d641e170a74 136 while(1) {
julientiron 2:b5166e24c7a6 137 /*
julientiron 0:3d641e170a74 138 if(go_to_sleep)
julientiron 0:3d641e170a74 139 {
julientiron 0:3d641e170a74 140 myled = 0;
julientiron 0:3d641e170a74 141 event_button.enable_irq(); // Enable the interrupt request
julientiron 0:3d641e170a74 142 //sleep(); // Enter Low Power Mode
julientiron 0:3d641e170a74 143 deepsleep(); // Enter Low Power Mode (deep)
julientiron 0:3d641e170a74 144 wait_ms(200); // Wait 200ms for debounce
julientiron 0:3d641e170a74 145 event_button.enable_irq(); // Enable the interrupt request
julientiron 2:b5166e24c7a6 146 }*/
julientiron 2:b5166e24c7a6 147 //else
julientiron 2:b5166e24c7a6 148 mu.checkDistance();
julientiron 0:3d641e170a74 149 myled = 1;
julientiron 2:b5166e24c7a6 150 wait(1);
julientiron 0:3d641e170a74 151 periodicCallback();//Works from here!!
julientiron 0:3d641e170a74 152 dev.waitForEvent();
julientiron 0:3d641e170a74 153 }
julientiron 0:3d641e170a74 154 }