Simple example to demonstrate custom made BLE service and characteristics.

Fork of BLE_GATT_Example by Bluetooth Low Energy

Files at this revision

API Documentation at this revision

Comitter:
andresag
Date:
Mon Nov 09 17:08:47 2015 +0000
Parent:
21:73f42c00b1db
Child:
23:924d0ef8f1cb
Commit message:
Update example to comply with initialisation changes in BLE API.

Changed in this revision

BLE_API.lib Show annotated file Show diff for this revision Revisions of this file
main.cpp Show annotated file Show diff for this revision Revisions of this file
mbed.bld Show annotated file Show diff for this revision Revisions of this file
nRF51822.lib Show annotated file Show diff for this revision Revisions of this file
--- a/BLE_API.lib	Tue Oct 20 13:48:13 2015 +0000
+++ b/BLE_API.lib	Mon Nov 09 17:08:47 2015 +0000
@@ -1,1 +1,1 @@
-http://mbed.org/teams/Bluetooth-Low-Energy/code/BLE_API/#d494ad3e87bd
+http://mbed.org/teams/Bluetooth-Low-Energy/code/BLE_API/#a097e1be76f4
--- a/main.cpp	Tue Oct 20 13:48:13 2015 +0000
+++ b/main.cpp	Mon Nov 09 17:08:47 2015 +0000
@@ -1,7 +1,6 @@
 #include "mbed.h"
 #include "ble/BLE.h"
 
-BLE ble;
 DigitalOut led(LED1, 1);
 uint16_t customServiceUUID  = 0xA000;
 uint16_t readCharUUID       = 0xA001;
@@ -10,14 +9,14 @@
 const static char     DEVICE_NAME[]        = "ChangeMe!!"; // change this
 static const uint16_t uuid16_list[]        = {0xFFFF}; //Custom UUID, FFFF is reserved for development
 
-// Set Up custom Characteristics
+/* Set Up custom Characteristics */
 static uint8_t readValue[10] = {0};
 ReadOnlyArrayGattCharacteristic<uint8_t, sizeof(readValue)> readChar(readCharUUID, readValue);
 
 static uint8_t writeValue[10] = {0};
 WriteOnlyArrayGattCharacteristic<uint8_t, sizeof(writeValue)> writeChar(writeCharUUID, writeValue);
 
-// Set up custom service
+/* Set up custom service */
 GattCharacteristic *characteristics[] = {&readChar, &writeChar};
 GattService        customService(customServiceUUID, characteristics, sizeof(characteristics) / sizeof(GattCharacteristic *));
 
@@ -27,22 +26,22 @@
 */
 void disconnectionCallback(const Gap::DisconnectionCallbackParams_t *)
 {
-    ble.gap().startAdvertising();
+    BLE::Instance(BLE::DEFAULT_INSTANCE).gap().startAdvertising();
 }
 
 /*
- *  handle writes to writeCharacteristic
+ *  Handle writes to writeCharacteristic
 */
 void writeCharCallback(const GattWriteCallbackParams *params)
 {
-    // check to see what characteristic was written, by handle
+    /* Check to see what characteristic was written, by handle */
     if(params->handle == writeChar.getValueHandle()) {
-        // toggle LED if only 1 byte is written
+        /* toggle LED if only 1 byte is written */
         if(params->len == 1) {
             led = params->data[0];
             (params->data[0] == 0x00) ? printf("led on\n\r") : printf("led off\n\r"); // print led toggle
         }
-        // print the data if more than 1 byte is written
+        /* Print the data if more than 1 byte is written */
         else {
             printf("Data received: length = %d, data = 0x",params->len);
             for(int x=0; x < params->len; x++) {
@@ -50,38 +49,56 @@
             }
             printf("\n\r");
         }
-        // update the readChar with the value of writeChar
-        ble.updateCharacteristicValue(readChar.getValueHandle(), params->data,params->len);
+        /* Update the readChar with the value of writeChar */
+        BLE::Instance(BLE::DEFAULT_INSTANCE).gattServer().write(readChar.getValueHandle(), params->data, params->len);
     }
 }
+/*
+ * Initialization callback
+ */
+void bleInitComplete(BLE::InitializationCompleteCallbackContext *params)
+{
+    BLE &ble          = params->ble;
+    ble_error_t error = params->error;
+    
+    if (error != BLE_ERROR_NONE) {
+        return;
+    }
 
-/*
- *  main loop
-*/
-int
-main(void)
-{
-    /* initialize stuff */
-    printf("\n\r********* Starting Main Loop *********\n\r");
-    ble.init();
     ble.gap().onDisconnection(disconnectionCallback);
     ble.gattServer().onDataWritten(writeCharCallback);
 
-    /* setup advertising */
+    /* Setup advertising */
     ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::BREDR_NOT_SUPPORTED | GapAdvertisingData::LE_GENERAL_DISCOVERABLE); // BLE only, no classic BT
     ble.gap().setAdvertisingType(GapAdvertisingParams::ADV_CONNECTABLE_UNDIRECTED); // advertising type
     ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LOCAL_NAME, (uint8_t *)DEVICE_NAME, sizeof(DEVICE_NAME)); // add name
     ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LIST_16BIT_SERVICE_IDS, (uint8_t *)uuid16_list, sizeof(uuid16_list)); // UUID's broadcast in advertising packet
     ble.gap().setAdvertisingInterval(100); // 100ms.
 
-    // add our custom service
+    /* Add our custom service */
     ble.addService(customService);
 
-    // start advertising
+    /* Start advertising */
     ble.gap().startAdvertising();
+}
 
-    // infinite loop waiting for BLE interrupt events
+/*
+ *  Main loop
+*/
+int main(void)
+{
+    /* initialize stuff */
+    printf("\n\r********* Starting Main Loop *********\n\r");
+    
+    BLE& ble = BLE::Instance(BLE::DEFAULT_INSTANCE);
+    ble.init(bleInitComplete);
+    
+    /* SpinWait for initialization to complete. This is necessary because the
+     * BLE object is used in the main loop below. */
+    while (ble.hasInitialized()  == false) { /* spin loop */ }
+
+    /* Infinite loop waiting for BLE interrupt events */
     while (true) {
-        ble.waitForEvent(); //Save power
+        ble.waitForEvent(); /* Save power */
     }
 }
\ No newline at end of file
--- a/mbed.bld	Tue Oct 20 13:48:13 2015 +0000
+++ b/mbed.bld	Mon Nov 09 17:08:47 2015 +0000
@@ -1,1 +1,1 @@
-http://mbed.org/users/mbed_official/code/mbed/builds/34e6b704fe68
\ No newline at end of file
+http://mbed.org/users/mbed_official/code/mbed/builds/9296ab0bfc11
\ No newline at end of file
--- a/nRF51822.lib	Tue Oct 20 13:48:13 2015 +0000
+++ b/nRF51822.lib	Mon Nov 09 17:08:47 2015 +0000
@@ -1,1 +1,1 @@
-http://mbed.org/teams/Nordic-Semiconductor/code/nRF51822/#088f5738bf18
+http://mbed.org/teams/Nordic-Semiconductor/code/nRF51822/#bf85bf7e73d5