ble
Dependencies: HC_SR04_Ultrasonic_Library Servo mbed
Fork of FIP_REV1 by
Diff: main.cpp
- Revision:
- 0:3d641e170a74
- Child:
- 2:b5166e24c7a6
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.cpp Tue May 19 16:43:59 2015 +0000 @@ -0,0 +1,191 @@ +#include "mbed.h" + +DigitalOut myled(LED1); + +#include "debug.h" +#include "btle.h" +//#include "BlueNRGDevice.h"//User does not use any platform specific header file +#include "BLEDevice.h" +#include "UUID.h" +#include "Utils.h" + +BLEDevice dev; + +const static char DEVICE_NAME[] = "Proximity Sensor"; +const uint8_t device_address[6] = { 0xaa, 0x00, 0x00, 0xE1, 0x80, 0x03 }; //Peripheral address + +void Append128bitUUID(uint8_t *uuid128_list, const LongUUID_t HRM_SERVICE_UUID_128); +void print_array(uint8_t *array); + +/*********128 bit UUIDs. Not defined in GattCharacteristic.h and GattService.h*************/ + +InterruptIn event_button(USER_BUTTON); +volatile bool go_to_sleep = true; + +#define MAX_SERVICES_NOS 1 +//typedef uint8_t UUID_128_BIT[16]; +const LongUUID_t HEART_RATE_CHAR_UUID_128 = {0x42,0x82,0x1a,0x40, 0xe4,0x77, 0x11,0xe2, 0x82,0xd0, 0x00,0x02,0xa5,0xd5,0xc5,0x1a}; +const LongUUID_t HRM_SERVICE_UUID_128 = {0x42,0x82,0x1a,0x40, 0xe4,0x77, 0x11,0xe2, 0x82,0xd0, 0x00,0x02,0xa5,0xd5,0xc5,0x1b}; + +uint8_t UUID_Count=0; + +static uint8_t hrmCounter = 100; +static uint8_t bpm[2] = {0x00, hrmCounter}; +static uint8_t hcpCounter = 99; +static uint8_t hcp[2] = {0x00, hrmCounter}; + +GattCharacteristic hrmRate(GattCharacteristic::UUID_HEART_RATE_MEASUREMENT_CHAR, bpm, sizeof(bpm), sizeof(bpm), + GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_NOTIFY|GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_READ + /*GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_INDICATE*/); + +GattCharacteristic hcpControlPoint(GattCharacteristic::UUID_HEART_RATE_CONTROL_POINT_CHAR, hcp, sizeof(hcp), sizeof(hcp), + GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_WRITE_WITHOUT_RESPONSE| + GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_WRITE|GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_READ); + +GattCharacteristic *hrmChars[] = {&hrmRate, &hcpControlPoint }; +UUID HRMSERVICE(GattService::UUID_HEART_RATE_SERVICE); +GattService hrmService(HRMSERVICE/*GattService::UUID_HEART_RATE_SERVICE*/, hrmChars, sizeof(hrmChars) / sizeof(GattCharacteristic *)); + +uint8_t uuid128_list[16*MAX_SERVICES_NOS];// = {HRM_SERVICE_UUID_128[0], HRM_SERVICE_UUID_128[1]}; +static const uint16_t uuid16_list[] = {GattService::UUID_HEART_RATE_SERVICE}; + +void ISR_pressed() // ISR for the button press +{ + printf("Button pressed\n"); // Show that the button has pressed + go_to_sleep = !go_to_sleep; // Toogle the sleep state + event_button.disable_irq(); // Disable the interrupt request +} + +void disconnectionCallback(uint16_t Handle_t) +{ + DEBUG("Disconnected!\n\r"); + DEBUG("Restarting the advertising process\n\r"); + dev.startAdvertising(); +} + +void onWriteCallback(uint16_t attributeHandle) { + DEBUG("Write Callback!!\n\r"); + } + +void onConnectionCallback(uint16_t Handle_t) { + //myled = 1; // LED is ON + DEBUG("Connected BlueNRG!!\n\r"); + } + + +void onNotifyEnabled(uint16_t charHandle) { + //myled = 1; // LED is ON + DEBUG("onNotifyEnabled!!\n\r"); + } + +void onNotifyDisabled(uint16_t charHandle) { + //myled = 1; // LED is ON + DEBUG("onNotifyDisabled!!\n\r"); + } + +void onDataSentNotify() { + //myled = 1; // LED is ON + DEBUG("on Data Sent Notify!!\n\r"); + } + +void Append128bitUUID(uint8_t *array, const LongUUID_t SERVICE_UUID_128) +{ + for(int x=0;x<16; x++) + { + array[x+UUID_Count*16]=SERVICE_UUID_128[x]; + } + UUID_Count++; + return; +} + +/** + * Triggered periodically by the 'ticker' interrupt; updates hrmCounter. + */ +void periodicCallback(void) +{ + //myled = !myled; /* Do blinky on LED1 while we're waiting for BLE events */ + + if (dev.getGapState().connected) { + hrmCounter = rand()%(200-100) +100; + bpm[1] = hrmCounter; + uint16_t t = sizeof(bpm); + //DEBUG("Char Handle 0x%x OK.",hrmRate.getHandle()); + //dev.readCharacteristicValue(hrmRate.getHandle(), bpm, (uint16_t *const)t); + dev.updateCharacteristicValue(hrmRate.getHandle(), bpm, sizeof(bpm)); + //DEBUG("Ticker CB..\n\r"); + } //else DEBUG("Not Connected..\n\r"); + else //if not connected + { + hrmCounter = rand()%(200-100) +100; + } +} + +int main() { + + Ticker ticker; //For Tick interrupt if used later on (periodic data updates?) + event_button.mode(PullUp); // Setup the internall pull-up resistor + event_button.fall(&ISR_pressed); // Set the ISR associated to event fall (push the button) + + //LongUUID_t HEART_RATE_CHAR_UUID_128, HRM_SERVICE_UUID_128; + //COPY_HRM_SERVICE_UUID(HRM_SERVICE_UUID_128); + //COPY_HRM_CHAR_UUID(HEART_RATE_CHAR_UUID_128); + UUID heart_rate_char_UUID = UUID(HEART_RATE_CHAR_UUID_128); + UUID hrm_service_UUID = UUID(HRM_SERVICE_UUID_128); + + myled = 0;//Switch OFF LED1 + + DEBUG("Initializing BlueNRG...\n\r"); + dev.init(); + + dev.onConnection(onConnectionCallback); + dev.onDisconnection(disconnectionCallback); + dev.onDataWritten(onWriteCallback); + dev.onUpdatesEnabled(onNotifyEnabled); + dev.onDataSent(onDataSentNotify); + dev.onUpdatesDisabled(onNotifyDisabled); + + //TODO. + dev.setAddress(Gap::ADDR_TYPE_PUBLIC, device_address);//Will reset the device and re-init() + //TODO. + + //Append128bitUUID(uuid128_list, HRM_SERVICE_UUID_128); + + /* setup advertising */ + dev.accumulateAdvertisingPayload(GapAdvertisingData::BREDR_NOT_SUPPORTED | GapAdvertisingData::LE_GENERAL_DISCOVERABLE); + + //TODO:IMP STUFF: 128bit list is basically a uint8_t list. User should know how many services he supports and define the number in MAX_SERVICES_NOS + dev.accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LIST_16BIT_SERVICE_IDS, (uint8_t*)uuid16_list, sizeof(uuid16_list)); + + dev.accumulateAdvertisingPayload(GapAdvertisingData::HEART_RATE_SENSOR_HEART_RATE_BELT); + + dev.accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LOCAL_NAME, (uint8_t *)DEVICE_NAME, sizeof(DEVICE_NAME)); + dev.setAdvertisingType(GapAdvertisingParams::ADV_CONNECTABLE_UNDIRECTED); + dev.setAdvertisingInterval(160); /* 100ms; in multiples of 0.625ms. */ + DEBUG("Starting Advertising...\n\r"); + dev.startAdvertising(); + + dev.addService(hrmService); + //ticker.attach(periodicCallback, 1); Multi threading and called from ISR context does not work! + + while(1) { + + if(go_to_sleep) + { + myled = 0; + event_button.enable_irq(); // Enable the interrupt request + //sleep(); // Enter Low Power Mode + deepsleep(); // Enter Low Power Mode (deep) + wait_ms(200); // Wait 200ms for debounce + event_button.enable_irq(); // Enable the interrupt request + } + else + { + myled = 1; + wait(1); + //DEBUG("tic!\n\r"); + periodicCallback();//Works from here!! + + dev.waitForEvent(); + } + } +}