Dependencies: BLE_API mbed BLE_nRF8001 DebounceIn
main.cpp@0:adcc621e5713, 2015-03-14 (annotated)
- Committer:
- sitakumar
- Date:
- Sat Mar 14 19:25:40 2015 +0000
- Revision:
- 0:adcc621e5713
- Child:
- 2:f266f102ca80
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
sitakumar | 0:adcc621e5713 | 1 | #include "mbed.h" |
sitakumar | 0:adcc621e5713 | 2 | #include "BLEDevice.h" |
sitakumar | 0:adcc621e5713 | 3 | #include "nRF8001.h" |
sitakumar | 0:adcc621e5713 | 4 | |
sitakumar | 0:adcc621e5713 | 5 | |
sitakumar | 0:adcc621e5713 | 6 | BLEDevice ble; |
sitakumar | 0:adcc621e5713 | 7 | DigitalOut led1(LED1); |
sitakumar | 0:adcc621e5713 | 8 | InterruptIn button1(D1); |
sitakumar | 0:adcc621e5713 | 9 | InterruptIn button2(D2); |
sitakumar | 0:adcc621e5713 | 10 | |
sitakumar | 0:adcc621e5713 | 11 | const uint8_t LED1_UUID[LENGTH_OF_LONG_UUID] = { |
sitakumar | 0:adcc621e5713 | 12 | 0xfb, 0x71, 0xbc, 0xc0, 0x5a, 0x0c, 0x11, 0xe4, |
sitakumar | 0:adcc621e5713 | 13 | 0x91, 0xae, 0x00, 0x02, 0xa5, 0xd5, 0xc5, 0x1b |
sitakumar | 0:adcc621e5713 | 14 | }; |
sitakumar | 0:adcc621e5713 | 15 | const uint8_t BUTTON_UUID[LENGTH_OF_LONG_UUID] = { |
sitakumar | 0:adcc621e5713 | 16 | 0x7a, 0x77, 0xbe, 0x20, 0x5a, 0x0d, 0x11, 0xe4, |
sitakumar | 0:adcc621e5713 | 17 | 0xa9, 0x5e, 0x00, 0x02, 0xa5, 0xd5, 0xc5, 0x1b |
sitakumar | 0:adcc621e5713 | 18 | }; |
sitakumar | 0:adcc621e5713 | 19 | const uint8_t TEST_SERVICE_UUID[LENGTH_OF_LONG_UUID] = { |
sitakumar | 0:adcc621e5713 | 20 | 0xb0, 0xbb, 0x58, 0x20, 0x5a, 0x0d, 0x11, 0xe4, |
sitakumar | 0:adcc621e5713 | 21 | 0x93, 0xee, 0x00, 0x02, 0xa5, 0xd5, 0xc5, 0x1b |
sitakumar | 0:adcc621e5713 | 22 | }; |
sitakumar | 0:adcc621e5713 | 23 | |
sitakumar | 0:adcc621e5713 | 24 | const static char DEVICE_NAME[] = "Sita"; |
sitakumar | 0:adcc621e5713 | 25 | static volatile bool is_button_pressed = false; |
sitakumar | 0:adcc621e5713 | 26 | static volatile uint16_t led1_handler; |
sitakumar | 0:adcc621e5713 | 27 | |
sitakumar | 0:adcc621e5713 | 28 | uint8_t led_state, button_state; |
sitakumar | 0:adcc621e5713 | 29 | |
sitakumar | 0:adcc621e5713 | 30 | void disconnectionCallback(Gap::Handle_t handle, Gap::DisconnectionReason_t reason) |
sitakumar | 0:adcc621e5713 | 31 | { |
sitakumar | 0:adcc621e5713 | 32 | ble.startAdvertising(); // restart advertising |
sitakumar | 0:adcc621e5713 | 33 | } |
sitakumar | 0:adcc621e5713 | 34 | |
sitakumar | 0:adcc621e5713 | 35 | void changeLED(const GattCharacteristicWriteCBParams *eventDataP) { |
sitakumar | 0:adcc621e5713 | 36 | // eventDataP->charHandle is just uint16_t |
sitakumar | 0:adcc621e5713 | 37 | // it's used to dispatch the callbacks |
sitakumar | 0:adcc621e5713 | 38 | if (eventDataP->charHandle == led1_handler) { |
sitakumar | 0:adcc621e5713 | 39 | led1 = eventDataP->data[0] % 2; |
sitakumar | 0:adcc621e5713 | 40 | } |
sitakumar | 0:adcc621e5713 | 41 | } |
sitakumar | 0:adcc621e5713 | 42 | |
sitakumar | 0:adcc621e5713 | 43 | void button1Pressed() { |
sitakumar | 0:adcc621e5713 | 44 | button_state = 1; |
sitakumar | 0:adcc621e5713 | 45 | is_button_pressed = true; |
sitakumar | 0:adcc621e5713 | 46 | } |
sitakumar | 0:adcc621e5713 | 47 | void button2Pressed() { |
sitakumar | 0:adcc621e5713 | 48 | button_state = 2; |
sitakumar | 0:adcc621e5713 | 49 | is_button_pressed = true; |
sitakumar | 0:adcc621e5713 | 50 | } |
sitakumar | 0:adcc621e5713 | 51 | |
sitakumar | 0:adcc621e5713 | 52 | int main(void) |
sitakumar | 0:adcc621e5713 | 53 | { |
sitakumar | 0:adcc621e5713 | 54 | // button initialization |
sitakumar | 0:adcc621e5713 | 55 | // InterruptIn button1(BUTTON1); |
sitakumar | 0:adcc621e5713 | 56 | // InterruptIn button2(BUTTON2); |
sitakumar | 0:adcc621e5713 | 57 | button1.mode(PullUp); |
sitakumar | 0:adcc621e5713 | 58 | button2.mode(PullUp); |
sitakumar | 0:adcc621e5713 | 59 | button1.rise(&button1Pressed); |
sitakumar | 0:adcc621e5713 | 60 | button2.rise(&button2Pressed); |
sitakumar | 0:adcc621e5713 | 61 | led1 = 0; |
sitakumar | 0:adcc621e5713 | 62 | |
sitakumar | 0:adcc621e5713 | 63 | // just a simple service example |
sitakumar | 0:adcc621e5713 | 64 | // o led1 characteristics, you can write from the phone to control led1 |
sitakumar | 0:adcc621e5713 | 65 | // o button characteristics, you can read and get notified |
sitakumar | 0:adcc621e5713 | 66 | GattCharacteristic led1_characteristics( |
sitakumar | 0:adcc621e5713 | 67 | LED1_UUID, &led_state, sizeof(led_state), sizeof(led_state), |
sitakumar | 0:adcc621e5713 | 68 | GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_READ | |
sitakumar | 0:adcc621e5713 | 69 | GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_WRITE); |
sitakumar | 0:adcc621e5713 | 70 | led1_handler = led1_characteristics.getValueAttribute().getHandle(); |
sitakumar | 0:adcc621e5713 | 71 | |
sitakumar | 0:adcc621e5713 | 72 | GattCharacteristic button_characteristics( |
sitakumar | 0:adcc621e5713 | 73 | BUTTON_UUID, &button_state, sizeof(button_state), sizeof(button_state), |
sitakumar | 0:adcc621e5713 | 74 | GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_READ | |
sitakumar | 0:adcc621e5713 | 75 | GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_NOTIFY); |
sitakumar | 0:adcc621e5713 | 76 | |
sitakumar | 0:adcc621e5713 | 77 | const uint8_t TEST_SERVICE_UUID[LENGTH_OF_LONG_UUID] = { |
sitakumar | 0:adcc621e5713 | 78 | 0xb0, 0xbb, 0x58, 0x20, 0x5a, 0x0d, 0x11, 0xe4, |
sitakumar | 0:adcc621e5713 | 79 | 0x93, 0xee, 0x00, 0x02, 0xa5, 0xd5, 0xc5, 0x1b}; |
sitakumar | 0:adcc621e5713 | 80 | GattCharacteristic *charTable[] = {&led1_characteristics, &button_characteristics}; |
sitakumar | 0:adcc621e5713 | 81 | GattService testService(TEST_SERVICE_UUID, charTable, |
sitakumar | 0:adcc621e5713 | 82 | sizeof(charTable) / sizeof(GattCharacteristic *)); |
sitakumar | 0:adcc621e5713 | 83 | |
sitakumar | 0:adcc621e5713 | 84 | // BLE setup, mainly we add service and callbacks |
sitakumar | 0:adcc621e5713 | 85 | ble.init(); |
sitakumar | 0:adcc621e5713 | 86 | ble.addService(testService); |
sitakumar | 0:adcc621e5713 | 87 | ble.onDataWritten(&changeLED); |
sitakumar | 0:adcc621e5713 | 88 | ble.onDisconnection(disconnectionCallback); |
sitakumar | 0:adcc621e5713 | 89 | |
sitakumar | 0:adcc621e5713 | 90 | // setup advertising |
sitakumar | 0:adcc621e5713 | 91 | ble.accumulateAdvertisingPayload(GapAdvertisingData::BREDR_NOT_SUPPORTED | |
sitakumar | 0:adcc621e5713 | 92 | GapAdvertisingData::LE_GENERAL_DISCOVERABLE); |
sitakumar | 0:adcc621e5713 | 93 | ble.accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LOCAL_NAME, |
sitakumar | 0:adcc621e5713 | 94 | (uint8_t *)DEVICE_NAME, sizeof(DEVICE_NAME)); |
sitakumar | 0:adcc621e5713 | 95 | ble.setAdvertisingType(GapAdvertisingParams::ADV_CONNECTABLE_UNDIRECTED); |
sitakumar | 0:adcc621e5713 | 96 | ble.setAdvertisingInterval(1600); /* 1000ms; in multiples of 0.625ms. */ |
sitakumar | 0:adcc621e5713 | 97 | ble.startAdvertising(); |
sitakumar | 0:adcc621e5713 | 98 | |
sitakumar | 0:adcc621e5713 | 99 | while (true) { |
sitakumar | 0:adcc621e5713 | 100 | if (is_button_pressed) { |
sitakumar | 0:adcc621e5713 | 101 | // if button pressed, we update the characteristics |
sitakumar | 0:adcc621e5713 | 102 | is_button_pressed = false; |
sitakumar | 0:adcc621e5713 | 103 | ble.updateCharacteristicValue(button_characteristics.getValueAttribute().getHandle(), |
sitakumar | 0:adcc621e5713 | 104 | &button_state, sizeof(button_state)); |
sitakumar | 0:adcc621e5713 | 105 | } else { |
sitakumar | 0:adcc621e5713 | 106 | ble.waitForEvent(); |
sitakumar | 0:adcc621e5713 | 107 | } |
sitakumar | 0:adcc621e5713 | 108 | } |
sitakumar | 0:adcc621e5713 | 109 | } |