ST / Mbed OS mbed-os-example-ble-GAPButton

This example is a fork of the following mbed-os example:

https://developer.mbed.org/teams/mbed-os-examples/code/mbed-os-example-ble-GAPButton/

Please read the documentation in this page.

Files at this revision

API Documentation at this revision

Comitter:
mbed_official
Date:
Thu Jul 28 23:26:14 2016 +0100
Parent:
2:e532bbe3fd8e
Child:
4:368da4cfc6ba
Commit message:
Merge branch 'master' of https://github.com/ARMmbed/mbed-os-example-ble


Commit copied from https://github.com/ARMmbed/mbed-os-example-ble

Changed in this revision

README.md Show annotated file Show diff for this revision Revisions of this file
mbed-events.lib Show annotated file Show diff for this revision Revisions of this file
mbed-os.lib Show annotated file Show diff for this revision Revisions of this file
mbed_app.json Show annotated file Show diff for this revision Revisions of this file
module.json Show annotated file Show diff for this revision Revisions of this file
shields/TARGET_ST_BLUENRG.lib Show annotated file Show diff for this revision Revisions of this file
source/main.cpp Show annotated file Show diff for this revision Revisions of this file
--- a/README.md	Thu Jul 28 23:20:45 2016 +0100
+++ b/README.md	Thu Jul 28 23:26:14 2016 +0100
@@ -1,65 +1,65 @@
-# Button count over GAP
-
-This application shows how to use GAP to transmit a simple value to disconnected peer listening for advertisement every time that a value is updated:
-
-1. The value is a count of how many times a button on the device was pressed (the code actually monitors the button's releases, not press downs).
-
-1. We transmit the value in the SERVICE_DATA field of the advertising payload.
-
-# Running the application
-
-## Requirements
-
-The sample application can be seen on any BLE scanner on a smartphone. If you don't have a scanner on your phone, please install :
-
-- [nRF Master Control Panel](https://play.google.com/store/apps/details?id=no.nordicsemi.android.mcp) for Android.
-
-- [LightBlue](https://itunes.apple.com/gb/app/lightblue-bluetooth-low-energy/id557428110?mt=8) for iPhone.
-
-Hardware requirements are in the [main readme](https://github.com/ARMmbed/mbed-os-example-ble/blob/master/README.md).
-
-## Building instructions
-
-Building instructions for all samples are in the [main readme](https://github.com/ARMmbed/mbed-os-example-ble/blob/master/README.md).
-
-## Checking for success
-
-**Note:** Screens captures depicted below show what is expected from this example if the scanner used is *nRF Master Control Panel* version 4.0.5. If you encounter any difficulties consider trying another scanner or another version of nRF Master Control Panel. Alternative scanners may require reference to their manuals.
-
-1. Build the application and install it on your board as explained in the building instructions.
-
-1. Open the BLE scanner on your phone.
-
-1. Start a scan.
-
-    ![](img/start_scan.png)
-
-    **figure 1** How to start scan using nRF Master Control Panel 4.0.5.
-
-1. Find your device; it should be named `GAPButton`; and look at the advertisement broadcasted by your device (there is no need to connect to your device).
-
-    ![](img/discovery.png)
-
-    **figure 2** Scan results using nRF Master Control Panel 4.0.5.
-
-1. The Service Data field of the advertisement packet broadcasted by your device reflects the button press count. The starting value is 0.
-
-    ![](img/initial_state.png)
-
-    **figure 3** Initial state of the button using nRF Master Control Panel 4.0.5.
-
-1. Press the button on the device.
-
-    ![](img/first_press.png)
-
-    **figure 3** State after 1 button press using nRF Master Control Panel 4.0.5.
-
-1. The Service Data field value of the advertisement packet should change every time you press the button.
-
-    ![](img/result.png)
-
-    **figure 3** State after 6 button press using nRF Master Control Panel 4.0.5.
-
-## Note
-
-Since broadcasting is not reliable and your phone may scan intermittently, it is possible that your phone will miss button updates.
+# Button count over GAP
+
+This application shows how to use GAP to transmit a simple value to disconnected peer listening for advertisement every time that a value is updated:
+
+1. The value is a count of how many times a button on the device was pressed (the code actually monitors the button's releases, not press downs).
+
+1. We transmit the value in the SERVICE_DATA field of the advertising payload.
+
+# Running the application
+
+## Requirements
+
+The sample application can be seen on any BLE scanner on a smartphone. If you don't have a scanner on your phone, please install :
+
+- [nRF Master Control Panel](https://play.google.com/store/apps/details?id=no.nordicsemi.android.mcp) for Android.
+
+- [LightBlue](https://itunes.apple.com/gb/app/lightblue-bluetooth-low-energy/id557428110?mt=8) for iPhone.
+
+Hardware requirements are in the [main readme](https://github.com/ARMmbed/mbed-os-example-ble/blob/master/README.md).
+
+## Building instructions
+
+Building instructions for all samples are in the [main readme](https://github.com/ARMmbed/mbed-os-example-ble/blob/master/README.md).
+
+## Checking for success
+
+**Note:** Screens captures depicted below show what is expected from this example if the scanner used is *nRF Master Control Panel* version 4.0.5. If you encounter any difficulties consider trying another scanner or another version of nRF Master Control Panel. Alternative scanners may require reference to their manuals.
+
+1. Build the application and install it on your board as explained in the building instructions.
+
+1. Open the BLE scanner on your phone.
+
+1. Start a scan.
+
+    ![](img/start_scan.png)
+
+    **figure 1** How to start scan using nRF Master Control Panel 4.0.5.
+
+1. Find your device; it should be named `GAPButton`; and look at the advertisement broadcasted by your device (there is no need to connect to your device).
+
+    ![](img/discovery.png)
+
+    **figure 2** Scan results using nRF Master Control Panel 4.0.5.
+
+1. The Service Data field of the advertisement packet broadcasted by your device reflects the button press count. The starting value is 0.
+
+    ![](img/initial_state.png)
+
+    **figure 3** Initial state of the button using nRF Master Control Panel 4.0.5.
+
+1. Press the button on the device.
+
+    ![](img/first_press.png)
+
+    **figure 3** State after 1 button press using nRF Master Control Panel 4.0.5.
+
+1. The Service Data field value of the advertisement packet should change every time you press the button.
+
+    ![](img/result.png)
+
+    **figure 3** State after 6 button press using nRF Master Control Panel 4.0.5.
+
+## Note
+
+Since broadcasting is not reliable and your phone may scan intermittently, it is possible that your phone will miss button updates.
--- a/mbed-events.lib	Thu Jul 28 23:20:45 2016 +0100
+++ b/mbed-events.lib	Thu Jul 28 23:26:14 2016 +0100
@@ -1,1 +1,1 @@
-https://github.com/ARMmbed/mbed-events.git#6be60bf880c11a0beafcc2064bf467f8d897529a
+https://github.com/ARMmbed/mbed-events.git#6be60bf880c11a0beafcc2064bf467f8d897529a
--- a/mbed-os.lib	Thu Jul 28 23:20:45 2016 +0100
+++ b/mbed-os.lib	Thu Jul 28 23:26:14 2016 +0100
@@ -1,1 +1,1 @@
-https://github.com/mbedmicro/mbed#36468c9acbfeabb717d2cc7d2a7ea7d17df1ac09
+https://github.com/mbedmicro/mbed#36468c9acbfeabb717d2cc7d2a7ea7d17df1ac09
--- a/mbed_app.json	Thu Jul 28 23:20:45 2016 +0100
+++ b/mbed_app.json	Thu Jul 28 23:26:14 2016 +0100
@@ -1,13 +1,13 @@
-{
-    "target_overrides": {
-        "K64F": {
-            "target.features_add": ["BLE"],
-            "target.extra_labels_add": ["ST_BLUENRG"],
-            "target.macros_add": ["IDB0XA1_D13_PATCH"]
-        },
-        "NUCLEO_F401RE": {
-            "target.features_add": ["BLE"],
-            "target.extra_labels_add": ["ST_BLUENRG"]
-        }
-    }
-}
+{
+    "target_overrides": {
+        "K64F": {
+            "target.features_add": ["BLE"],
+            "target.extra_labels_add": ["ST_BLUENRG"],
+            "target.macros_add": ["IDB0XA1_D13_PATCH"]
+        },
+        "NUCLEO_F401RE": {
+            "target.features_add": ["BLE"],
+            "target.extra_labels_add": ["ST_BLUENRG"]
+        }
+    }
+}
--- a/module.json	Thu Jul 28 23:20:45 2016 +0100
+++ b/module.json	Thu Jul 28 23:26:14 2016 +0100
@@ -1,12 +1,12 @@
-{
-  "name": "ble-gapbutton",
-  "version": "0.0.1",
-  "bin": "./source",
-  "description": "BLE button that uses gap advertisement to broadcast its state.",
-  "author": "Liyou Zhou",
-  "license": "Apache-2.0",
-  "dependencies": {
-    "mbed-drivers": "*",
-    "ble": "^2.0.0"
-  }
-}
+{
+  "name": "ble-gapbutton",
+  "version": "0.0.1",
+  "bin": "./source",
+  "description": "BLE button that uses gap advertisement to broadcast its state.",
+  "author": "Liyou Zhou",
+  "license": "Apache-2.0",
+  "dependencies": {
+    "mbed-drivers": "*",
+    "ble": "^2.0.0"
+  }
+}
--- a/shields/TARGET_ST_BLUENRG.lib	Thu Jul 28 23:20:45 2016 +0100
+++ b/shields/TARGET_ST_BLUENRG.lib	Thu Jul 28 23:26:14 2016 +0100
@@ -1,1 +1,1 @@
-https://github.com/ARMmbed/ble-x-nucleo-idb0xa1#6781fbb835912132d7fed0d78606c7090ae03959
+https://github.com/ARMmbed/ble-x-nucleo-idb0xa1#6781fbb835912132d7fed0d78606c7090ae03959
--- a/source/main.cpp	Thu Jul 28 23:20:45 2016 +0100
+++ b/source/main.cpp	Thu Jul 28 23:26:14 2016 +0100
@@ -1,198 +1,198 @@
-/* mbed Microcontroller Library
- * Copyright (c) 2006-2013 ARM Limited
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include <mbed-events/events.h>
-#include <mbed.h>
-#include "ble/BLE.h"
-
-DigitalOut  led1(LED1, 1);
-InterruptIn button(BUTTON1);
-uint8_t cnt;
-
-// Change your device name below
-const char DEVICE_NAME[] = "GAPButton";
-
-/* We can arbiturarily choose the GAPButton service UUID to be 0xAA00
- * as long as it does not overlap with the UUIDs defined here:
- * https://developer.bluetooth.org/gatt/services/Pages/ServicesHome.aspx */
-#define GAPButtonUUID 0xAA00
-const uint16_t uuid16_list[] = {GAPButtonUUID};
-
-static EventQueue eventQueue(
-    /* event count */ 16 * /* event size */ 32
-);
-
-void print_error(ble_error_t error, const char* msg)
-{
-    printf("%s: ", msg);
-    switch(error) {
-        case BLE_ERROR_NONE:
-            printf("BLE_ERROR_NONE: No error");
-            break;
-        case BLE_ERROR_BUFFER_OVERFLOW:
-            printf("BLE_ERROR_BUFFER_OVERFLOW: The requested action would cause a buffer overflow and has been aborted");
-            break;
-        case BLE_ERROR_NOT_IMPLEMENTED:
-            printf("BLE_ERROR_NOT_IMPLEMENTED: Requested a feature that isn't yet implement or isn't supported by the target HW");
-            break;
-        case BLE_ERROR_PARAM_OUT_OF_RANGE:
-            printf("BLE_ERROR_PARAM_OUT_OF_RANGE: One of the supplied parameters is outside the valid range");
-            break;
-        case BLE_ERROR_INVALID_PARAM:
-            printf("BLE_ERROR_INVALID_PARAM: One of the supplied parameters is invalid");
-            break;
-        case BLE_STACK_BUSY:
-            printf("BLE_STACK_BUSY: The stack is busy");
-            break;
-        case BLE_ERROR_INVALID_STATE:
-            printf("BLE_ERROR_INVALID_STATE: Invalid state");
-            break;
-        case BLE_ERROR_NO_MEM:
-            printf("BLE_ERROR_NO_MEM: Out of Memory");
-            break;
-        case BLE_ERROR_OPERATION_NOT_PERMITTED:
-            printf("BLE_ERROR_OPERATION_NOT_PERMITTED");
-            break;
-        case BLE_ERROR_INITIALIZATION_INCOMPLETE:
-            printf("BLE_ERROR_INITIALIZATION_INCOMPLETE");
-            break;
-        case BLE_ERROR_ALREADY_INITIALIZED:
-            printf("BLE_ERROR_ALREADY_INITIALIZED");
-            break;
-        case BLE_ERROR_UNSPECIFIED:
-            printf("BLE_ERROR_UNSPECIFIED: Unknown error");
-            break;
-        case BLE_ERROR_INTERNAL_STACK_FAILURE:
-            printf("BLE_ERROR_INTERNAL_STACK_FAILURE: internal stack faillure");
-            break;
-    }
-    printf("\r\n");
-}
-
-void updatePayload(void)
-{
-    // Update the count in the SERVICE_DATA field of the advertising payload
-    uint8_t service_data[3];
-    service_data[0] = GAPButtonUUID & 0xff;
-    service_data[1] = GAPButtonUUID >> 8;
-    service_data[2] = cnt; // Put the button click count in the third byte
-    ble_error_t err = BLE::Instance().gap().updateAdvertisingPayload(GapAdvertisingData::SERVICE_DATA, (uint8_t *)service_data, sizeof(service_data));
-    if (err != BLE_ERROR_NONE) {
-        print_error(err, "Updating payload failed");
-    }
-}
-
-void buttonPressedCallback(void)
-{
-    ++cnt;
-
-    // Calling BLE api in interrupt context may cause race conditions
-    // Using mbed-events to schedule calls to BLE api for safety
-    eventQueue.post(updatePayload);
-}
-
-void blinkCallback(void)
-{
-    led1 = !led1;
-}
-
-void bleInitComplete(BLE::InitializationCompleteCallbackContext *context)
-{
-    BLE&        ble = context->ble;
-    ble_error_t err = context->error;
-
-    if (err != BLE_ERROR_NONE) {
-        print_error(err, "BLE initialisation failed");
-        return;
-    }
-
-    // Set up the advertising flags. Note: not all combination of flags are valid
-    // BREDR_NOT_SUPPORTED: Device does not support Basic Rate or Enchanced Data Rate, It is Low Energy only.
-    // LE_GENERAL_DISCOVERABLE: Peripheral device is discoverable at any moment
-    err = ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::BREDR_NOT_SUPPORTED | GapAdvertisingData::LE_GENERAL_DISCOVERABLE);
-    if (err != BLE_ERROR_NONE) {
-        print_error(err, "Setting GAP flags failed");
-        return;
-    }
-
-    // Put the device name in the advertising payload
-    err = ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LOCAL_NAME, (uint8_t *)DEVICE_NAME, sizeof(DEVICE_NAME));
-    if (err != BLE_ERROR_NONE) {
-        print_error(err, "Setting device name failed");
-        return;
-    }
-
-    err = ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LIST_16BIT_SERVICE_IDS, (uint8_t *)uuid16_list, sizeof(uuid16_list));
-    if (err != BLE_ERROR_NONE) {
-        print_error(err, "Setting service UUID failed");
-        return;
-    }
-
-    // The Service Data data type consists of a service UUID with the data associated with that service.
-    // We will encode the number of button clicks in the Service Data field
-    // First two bytes of SERVICE_DATA field should contain the UUID of the service
-    uint8_t service_data[3];
-    service_data[0] = GAPButtonUUID & 0xff;
-    service_data[1] = GAPButtonUUID >> 8;
-    service_data[2] = cnt; // Put the button click count in the third byte
-    err = ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::SERVICE_DATA, (uint8_t *)service_data, sizeof(service_data));
-    if (err != BLE_ERROR_NONE) {
-        print_error(err, "Setting service data failed");
-        return;
-    }
-
-    // It is not connectable as we are just boardcasting
-    ble.gap().setAdvertisingType(GapAdvertisingParams::ADV_NON_CONNECTABLE_UNDIRECTED);
-
-    // Send out the advertising payload every 1000ms
-    ble.gap().setAdvertisingInterval(1000);
-
-    err = ble.gap().startAdvertising();
-    if (err != BLE_ERROR_NONE) {
-        print_error(err, "Sart advertising failed");
-        return;
-    }
-}
-
-void scheduleBleEventsProcessing(BLE::OnEventsToProcessCallbackContext* context) {
-    BLE &ble = BLE::Instance();
-    eventQueue.post(Callback<void()>(&ble, &BLE::processEvents));
-}
-
-int main()
-{
-    cnt = 0;
-
-    BLE &ble = BLE::Instance();
-    ble.onEventsToProcess(scheduleBleEventsProcessing);
-    ble_error_t err = ble.init(bleInitComplete);
-    if (err != BLE_ERROR_NONE) {
-        print_error(err, "BLE initialisation failed");
-        return 0;
-    }
-
-    // Blink LED every 500 ms to indicate system aliveness
-    eventQueue.post_every(500, blinkCallback);
-
-    // Register function to be called when button is released
-    button.rise(buttonPressedCallback);
-
-    while (true) {
-        eventQueue.dispatch();
-    }
-
-    return 0;
-}
+/* mbed Microcontroller Library
+ * Copyright (c) 2006-2013 ARM Limited
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <mbed-events/events.h>
+#include <mbed.h>
+#include "ble/BLE.h"
+
+DigitalOut  led1(LED1, 1);
+InterruptIn button(BUTTON1);
+uint8_t cnt;
+
+// Change your device name below
+const char DEVICE_NAME[] = "GAPButton";
+
+/* We can arbiturarily choose the GAPButton service UUID to be 0xAA00
+ * as long as it does not overlap with the UUIDs defined here:
+ * https://developer.bluetooth.org/gatt/services/Pages/ServicesHome.aspx */
+#define GAPButtonUUID 0xAA00
+const uint16_t uuid16_list[] = {GAPButtonUUID};
+
+static EventQueue eventQueue(
+    /* event count */ 16 * /* event size */ 32
+);
+
+void print_error(ble_error_t error, const char* msg)
+{
+    printf("%s: ", msg);
+    switch(error) {
+        case BLE_ERROR_NONE:
+            printf("BLE_ERROR_NONE: No error");
+            break;
+        case BLE_ERROR_BUFFER_OVERFLOW:
+            printf("BLE_ERROR_BUFFER_OVERFLOW: The requested action would cause a buffer overflow and has been aborted");
+            break;
+        case BLE_ERROR_NOT_IMPLEMENTED:
+            printf("BLE_ERROR_NOT_IMPLEMENTED: Requested a feature that isn't yet implement or isn't supported by the target HW");
+            break;
+        case BLE_ERROR_PARAM_OUT_OF_RANGE:
+            printf("BLE_ERROR_PARAM_OUT_OF_RANGE: One of the supplied parameters is outside the valid range");
+            break;
+        case BLE_ERROR_INVALID_PARAM:
+            printf("BLE_ERROR_INVALID_PARAM: One of the supplied parameters is invalid");
+            break;
+        case BLE_STACK_BUSY:
+            printf("BLE_STACK_BUSY: The stack is busy");
+            break;
+        case BLE_ERROR_INVALID_STATE:
+            printf("BLE_ERROR_INVALID_STATE: Invalid state");
+            break;
+        case BLE_ERROR_NO_MEM:
+            printf("BLE_ERROR_NO_MEM: Out of Memory");
+            break;
+        case BLE_ERROR_OPERATION_NOT_PERMITTED:
+            printf("BLE_ERROR_OPERATION_NOT_PERMITTED");
+            break;
+        case BLE_ERROR_INITIALIZATION_INCOMPLETE:
+            printf("BLE_ERROR_INITIALIZATION_INCOMPLETE");
+            break;
+        case BLE_ERROR_ALREADY_INITIALIZED:
+            printf("BLE_ERROR_ALREADY_INITIALIZED");
+            break;
+        case BLE_ERROR_UNSPECIFIED:
+            printf("BLE_ERROR_UNSPECIFIED: Unknown error");
+            break;
+        case BLE_ERROR_INTERNAL_STACK_FAILURE:
+            printf("BLE_ERROR_INTERNAL_STACK_FAILURE: internal stack faillure");
+            break;
+    }
+    printf("\r\n");
+}
+
+void updatePayload(void)
+{
+    // Update the count in the SERVICE_DATA field of the advertising payload
+    uint8_t service_data[3];
+    service_data[0] = GAPButtonUUID & 0xff;
+    service_data[1] = GAPButtonUUID >> 8;
+    service_data[2] = cnt; // Put the button click count in the third byte
+    ble_error_t err = BLE::Instance().gap().updateAdvertisingPayload(GapAdvertisingData::SERVICE_DATA, (uint8_t *)service_data, sizeof(service_data));
+    if (err != BLE_ERROR_NONE) {
+        print_error(err, "Updating payload failed");
+    }
+}
+
+void buttonPressedCallback(void)
+{
+    ++cnt;
+
+    // Calling BLE api in interrupt context may cause race conditions
+    // Using mbed-events to schedule calls to BLE api for safety
+    eventQueue.post(updatePayload);
+}
+
+void blinkCallback(void)
+{
+    led1 = !led1;
+}
+
+void bleInitComplete(BLE::InitializationCompleteCallbackContext *context)
+{
+    BLE&        ble = context->ble;
+    ble_error_t err = context->error;
+
+    if (err != BLE_ERROR_NONE) {
+        print_error(err, "BLE initialisation failed");
+        return;
+    }
+
+    // Set up the advertising flags. Note: not all combination of flags are valid
+    // BREDR_NOT_SUPPORTED: Device does not support Basic Rate or Enchanced Data Rate, It is Low Energy only.
+    // LE_GENERAL_DISCOVERABLE: Peripheral device is discoverable at any moment
+    err = ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::BREDR_NOT_SUPPORTED | GapAdvertisingData::LE_GENERAL_DISCOVERABLE);
+    if (err != BLE_ERROR_NONE) {
+        print_error(err, "Setting GAP flags failed");
+        return;
+    }
+
+    // Put the device name in the advertising payload
+    err = ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LOCAL_NAME, (uint8_t *)DEVICE_NAME, sizeof(DEVICE_NAME));
+    if (err != BLE_ERROR_NONE) {
+        print_error(err, "Setting device name failed");
+        return;
+    }
+
+    err = ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LIST_16BIT_SERVICE_IDS, (uint8_t *)uuid16_list, sizeof(uuid16_list));
+    if (err != BLE_ERROR_NONE) {
+        print_error(err, "Setting service UUID failed");
+        return;
+    }
+
+    // The Service Data data type consists of a service UUID with the data associated with that service.
+    // We will encode the number of button clicks in the Service Data field
+    // First two bytes of SERVICE_DATA field should contain the UUID of the service
+    uint8_t service_data[3];
+    service_data[0] = GAPButtonUUID & 0xff;
+    service_data[1] = GAPButtonUUID >> 8;
+    service_data[2] = cnt; // Put the button click count in the third byte
+    err = ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::SERVICE_DATA, (uint8_t *)service_data, sizeof(service_data));
+    if (err != BLE_ERROR_NONE) {
+        print_error(err, "Setting service data failed");
+        return;
+    }
+
+    // It is not connectable as we are just boardcasting
+    ble.gap().setAdvertisingType(GapAdvertisingParams::ADV_NON_CONNECTABLE_UNDIRECTED);
+
+    // Send out the advertising payload every 1000ms
+    ble.gap().setAdvertisingInterval(1000);
+
+    err = ble.gap().startAdvertising();
+    if (err != BLE_ERROR_NONE) {
+        print_error(err, "Sart advertising failed");
+        return;
+    }
+}
+
+void scheduleBleEventsProcessing(BLE::OnEventsToProcessCallbackContext* context) {
+    BLE &ble = BLE::Instance();
+    eventQueue.post(Callback<void()>(&ble, &BLE::processEvents));
+}
+
+int main()
+{
+    cnt = 0;
+
+    BLE &ble = BLE::Instance();
+    ble.onEventsToProcess(scheduleBleEventsProcessing);
+    ble_error_t err = ble.init(bleInitComplete);
+    if (err != BLE_ERROR_NONE) {
+        print_error(err, "BLE initialisation failed");
+        return 0;
+    }
+
+    // Blink LED every 500 ms to indicate system aliveness
+    eventQueue.post_every(500, blinkCallback);
+
+    // Register function to be called when button is released
+    button.rise(buttonPressedCallback);
+
+    while (true) {
+        eventQueue.dispatch();
+    }
+
+    return 0;
+}