This fork is functionally identical to the main path, but has been updated to reflect changes in the library APIs, so this code now builds straight "out of the box" without needing modifications
Dependencies: BLE_API mbed nRF51822
Fork of BLE_GATT_Example by
main.cpp@9:b33f42191584, 2015-03-09 (annotated)
- Committer:
- mbedAustin
- Date:
- Mon Mar 09 19:21:06 2015 +0000
- Revision:
- 9:b33f42191584
- Parent:
- 8:60ede963dfe2
- Child:
- 10:6acaa9f0ef85
Final Publishable version;
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
mbedAustin | 0:cd5b6733aeb1 | 1 | #include "mbed.h" |
mbedAustin | 0:cd5b6733aeb1 | 2 | #include "BLEDevice.h" |
mbedAustin | 1:94152e7d8b5c | 3 | #include "CustomService.h" |
mbedAustin | 1:94152e7d8b5c | 4 | |
mbedAustin | 1:94152e7d8b5c | 5 | BLEDevice ble; |
mbedAustin | 1:94152e7d8b5c | 6 | DigitalOut led(LED1); |
mbedAustin | 9:b33f42191584 | 7 | uint16_t customServiceUUID = 0xA000; |
mbedAustin | 9:b33f42191584 | 8 | uint16_t reachCharUUID = 0xA001; |
mbedAustin | 9:b33f42191584 | 9 | uint16_t writeCharUUID = 0xA002; |
mbedAustin | 1:94152e7d8b5c | 10 | |
mbedAustin | 7:f6814152873c | 11 | const static char DEVICE_NAME[] = "ChangeMe!!"; // change this |
mbedAustin | 8:60ede963dfe2 | 12 | static const uint16_t uuid16_list[] = {0xFFFF}; //Custom UUID, FFFF is reserved for development |
mbedAustin | 1:94152e7d8b5c | 13 | |
mbedAustin | 2:e84c13abc479 | 14 | // Set Up Characteristics |
mbedAustin | 9:b33f42191584 | 15 | static uint8_t readValue[10] = {0}; |
mbedAustin | 9:b33f42191584 | 16 | GattCharacteristic readChar(reachCharUUID, readValue, sizeof(readValue), sizeof(readValue), |
mbedAustin | 8:60ede963dfe2 | 17 | GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_READ | GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_NOTIFY); |
mbedAustin | 2:e84c13abc479 | 18 | |
mbedAustin | 9:b33f42191584 | 19 | static uint8_t writeValue[10] = {0}; |
mbedAustin | 9:b33f42191584 | 20 | GattCharacteristic writeChar(writeCharUUID, writeValue, sizeof(writeValue), sizeof(writeValue), |
mbedAustin | 8:60ede963dfe2 | 21 | GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_WRITE | GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_NOTIFY); |
mbedAustin | 2:e84c13abc479 | 22 | |
mbedAustin | 2:e84c13abc479 | 23 | // Set up custom service |
mbedAustin | 8:60ede963dfe2 | 24 | GattCharacteristic *characteristics[] = {&readChar, &writeChar}; |
mbedAustin | 9:b33f42191584 | 25 | GattService customService(customServiceUUID, characteristics, sizeof(characteristics) / sizeof(GattCharacteristic *)); |
mbedAustin | 2:e84c13abc479 | 26 | |
mbedAustin | 2:e84c13abc479 | 27 | |
mbedAustin | 8:60ede963dfe2 | 28 | /* |
mbedAustin | 8:60ede963dfe2 | 29 | * Restart advertising when phone app disconnects |
mbedAustin | 8:60ede963dfe2 | 30 | */ |
mbedAustin | 1:94152e7d8b5c | 31 | void disconnectionCallback(Gap::Handle_t handle, Gap::DisconnectionReason_t reason) |
mbedAustin | 1:94152e7d8b5c | 32 | { |
mbedAustin | 8:60ede963dfe2 | 33 | ble.startAdvertising(); |
mbedAustin | 1:94152e7d8b5c | 34 | } |
mbedAustin | 0:cd5b6733aeb1 | 35 | |
mbedAustin | 8:60ede963dfe2 | 36 | /* |
mbedAustin | 8:60ede963dfe2 | 37 | * handle writes to writeCharacteristic |
mbedAustin | 8:60ede963dfe2 | 38 | */ |
mbedAustin | 4:7ef90665b399 | 39 | void writeCharCallback(const GattCharacteristicWriteCBParams *params) |
mbedAustin | 3:0fb60f81f693 | 40 | { |
mbedAustin | 8:60ede963dfe2 | 41 | // check to see what characteristic was written, by handle |
mbedAustin | 8:60ede963dfe2 | 42 | if(params->charHandle == writeChar.getValueHandle()) { |
mbedAustin | 8:60ede963dfe2 | 43 | // toggle LED if only 1 byte is written |
mbedAustin | 8:60ede963dfe2 | 44 | if(params->len == 1) { |
mbedAustin | 8:60ede963dfe2 | 45 | led = params->data[0]; |
mbedAustin | 8:60ede963dfe2 | 46 | } |
mbedAustin | 8:60ede963dfe2 | 47 | // print the data if more than 1 byte is written |
mbedAustin | 8:60ede963dfe2 | 48 | else { |
mbedAustin | 8:60ede963dfe2 | 49 | for(int x=0; x < params->len; x++) { |
mbedAustin | 8:60ede963dfe2 | 50 | printf("%x",params->data[x]); |
mbedAustin | 8:60ede963dfe2 | 51 | } |
mbedAustin | 8:60ede963dfe2 | 52 | printf("\n\r"); // print newline |
mbedAustin | 8:60ede963dfe2 | 53 | } |
mbedAustin | 8:60ede963dfe2 | 54 | // update the readChar with the value of writeChar |
mbedAustin | 8:60ede963dfe2 | 55 | ble.updateCharacteristicValue(readChar.getValueHandle(),params->data,params->len); |
mbedAustin | 8:60ede963dfe2 | 56 | } |
mbedAustin | 3:0fb60f81f693 | 57 | } |
mbedAustin | 0:cd5b6733aeb1 | 58 | |
mbedAustin | 8:60ede963dfe2 | 59 | /* |
mbedAustin | 8:60ede963dfe2 | 60 | * main loop |
mbedAustin | 8:60ede963dfe2 | 61 | */ |
mbedAustin | 0:cd5b6733aeb1 | 62 | int |
mbedAustin | 0:cd5b6733aeb1 | 63 | main(void) |
mbedAustin | 0:cd5b6733aeb1 | 64 | { |
mbedAustin | 8:60ede963dfe2 | 65 | /* initialize stuff */ |
mbedAustin | 8:60ede963dfe2 | 66 | printf("\n\r********* Starting Main Loop *********\n\r"); |
mbedAustin | 8:60ede963dfe2 | 67 | led = 1; // turn LED off (led is inverted) |
mbedAustin | 2:e84c13abc479 | 68 | ble.init(); |
mbedAustin | 2:e84c13abc479 | 69 | ble.onDisconnection(disconnectionCallback); |
mbedAustin | 4:7ef90665b399 | 70 | ble.onDataWritten(writeCharCallback); //TODO: this is not correct, figure out correct syntax |
mbedAustin | 2:e84c13abc479 | 71 | |
mbedAustin | 2:e84c13abc479 | 72 | /* setup advertising */ |
mbedAustin | 7:f6814152873c | 73 | ble.accumulateAdvertisingPayload(GapAdvertisingData::BREDR_NOT_SUPPORTED | GapAdvertisingData::LE_GENERAL_DISCOVERABLE); // BLE only, no classic BT |
mbedAustin | 7:f6814152873c | 74 | ble.setAdvertisingType(GapAdvertisingParams::ADV_CONNECTABLE_UNDIRECTED); // advertising type |
mbedAustin | 7:f6814152873c | 75 | ble.accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LOCAL_NAME, (uint8_t *)DEVICE_NAME, sizeof(DEVICE_NAME)); // add name |
mbedAustin | 7:f6814152873c | 76 | ble.accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LIST_16BIT_SERVICE_IDS, (uint8_t *)uuid16_list, sizeof(uuid16_list)); // UUID's broadcast in advertising packet |
mbedAustin | 2:e84c13abc479 | 77 | ble.setAdvertisingInterval(160); /* 100ms; in multiples of 0.625ms. */ |
mbedAustin | 2:e84c13abc479 | 78 | |
mbedAustin | 8:60ede963dfe2 | 79 | // add our custom service |
mbedAustin | 2:e84c13abc479 | 80 | ble.addService(customService); // Add our custom service to device |
mbedAustin | 2:e84c13abc479 | 81 | |
mbedAustin | 7:f6814152873c | 82 | ble.startAdvertising(); // start advertising |
mbedAustin | 9:b33f42191584 | 83 | |
mbedAustin | 9:b33f42191584 | 84 | // infinite loop waiting for BLE interrupt events |
mbedAustin | 2:e84c13abc479 | 85 | while (true) { |
mbedAustin | 2:e84c13abc479 | 86 | ble.waitForEvent(); //Save power |
mbedAustin | 2:e84c13abc479 | 87 | } |
mbedAustin | 8:60ede963dfe2 | 88 | } |