Central/ Peripheral example: Central Device connects to a Peripheral called "LED" and additionally a led can be toggled with a button -> BLE_LED_PERIPHERAL needed

Dependencies:   BLE_API mbed nRF51822

Fork of BLE_LED_CENTRAL by Alex Gernhaeuser

Files at this revision

API Documentation at this revision

Comitter:
Alexgerni
Date:
Tue Aug 08 20:35:34 2017 +0000
Commit message:
Central Device connects to a Peripheral called "LED" and additionally a led can be toggled with a button -> BLE_LED_PERIPHERAL needed

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
diff -r 000000000000 -r 26b1912de8d8 BLE_API.lib
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/BLE_API.lib	Tue Aug 08 20:35:34 2017 +0000
@@ -0,0 +1,1 @@
+http://mbed.org/teams/Bluetooth-Low-Energy/code/BLE_API/#65474dc93927
diff -r 000000000000 -r 26b1912de8d8 main.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Tue Aug 08 20:35:34 2017 +0000
@@ -0,0 +1,155 @@
+/* mbed Microcontroller Library
+ * Copyright (c) 2006-2015 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.h"
+#include "ble/BLE.h"
+#include "ble/DiscoveredCharacteristic.h"
+#include "ble/DiscoveredService.h"
+
+DigitalOut alivenessLED(p16, 0);
+InterruptIn button(p9);
+Serial pc(p5, p4);
+Ticker ticker, ticker2;
+
+static DiscoveredCharacteristic ledCharacteristic;
+static const char PEER_NAME[] = "LED";
+
+void periodicCallback(void) 
+{ 
+    alivenessLED = !alivenessLED; /* Do blinky on LED1 while we're waiting for BLE events */
+}
+
+void buttonPressedCallback(void)
+{
+    /* Note that the buttonPressedCallback() executes in interrupt context, so it is safer to access
+     * BLE device API from the main thread. */
+    uint8_t toggledValue = 0x1;
+    ledCharacteristic.write(1, &toggledValue);
+    pc.printf("LED on... \n");
+}
+
+void buttonReleasedCallback(void)
+{
+    /* Note that the buttonPressedCallback() executes in interrupt context, so it is safer to access
+     * BLE device API from the main thread. */
+    uint8_t toggledValue = 0x0;
+    ledCharacteristic.write(1, &toggledValue);
+    pc.printf("LED off... \n");
+}
+
+void advertisementCallback(const Gap::AdvertisementCallbackParams_t *params) 
+{
+    // parse the advertising payload, looking for data type COMPLETE_LOCAL_NAME
+    // The advertising payload is a collection of key/value records where
+    // byte 0: length of the record excluding this byte
+    // byte 1: The key, it is the type of the data
+    // byte [2..N] The value. N is equal to byte0 - 1
+    for (uint8_t i = 0; i < params->advertisingDataLen; ++i) {
+
+        const uint8_t record_length = params->advertisingData[i];
+        if (record_length == 0) {
+            continue;
+        }
+        const uint8_t type = params->advertisingData[i + 1];
+        const uint8_t* value = params->advertisingData + i + 2;
+        const uint8_t value_length = record_length - 1;
+
+        if(type == GapAdvertisingData::COMPLETE_LOCAL_NAME) {
+            if ((value_length == sizeof(PEER_NAME)) && (memcmp(value, PEER_NAME, value_length) == 0)) {
+                pc.printf(
+                    "adv peerAddr[%02x %02x %02x %02x %02x %02x] rssi %d, isScanResponse %u, AdvertisementType %u\r\n",
+                    params->peerAddr[5], params->peerAddr[4], params->peerAddr[3], params->peerAddr[2],
+                    params->peerAddr[1], params->peerAddr[0], params->rssi, params->isScanResponse, params->type
+                );
+                BLE::Instance().gap().connect(params->peerAddr, Gap::ADDR_TYPE_RANDOM_STATIC, NULL, NULL);
+                break;
+            }
+        }
+        i += record_length;
+    }
+}
+
+void characteristicDiscoveryCallback(const DiscoveredCharacteristic *characteristicP) 
+{
+    pc.printf("  C UUID-%x valueAttr[%u] props[%x]\r\n", characteristicP->getUUID().getShortUUID(), characteristicP->getValueHandle(), (uint8_t)characteristicP->getProperties().broadcast());
+    if (characteristicP->getUUID().getShortUUID() == 0xa001) { /* !ALERT! Alter this filter to suit your device. */
+        ledCharacteristic        = *characteristicP;
+    }
+}
+
+void connectionCallback(const Gap::ConnectionCallbackParams_t *params) 
+{
+    if (params->role == Gap::CENTRAL) {
+        BLE &ble = BLE::Instance();
+        //ble.gattClient().onServiceDiscoveryTermination(discoveryTerminationCallback);
+        ble.gattClient().launchServiceDiscovery(params->handle, NULL, characteristicDiscoveryCallback, 0xa000, 0xa001);
+    }
+}
+
+void disconnectionCallback(const Gap::DisconnectionCallbackParams_t *) 
+{
+    pc.printf("disconnected\r\n");
+    /* Start scanning and try to connect again */
+    BLE::Instance().gap().startScan(advertisementCallback);
+}
+
+void onBleInitError(BLE &ble, ble_error_t error)
+{
+   /* Initialization error handling should go here */
+}
+
+void bleInitComplete(BLE::InitializationCompleteCallbackContext *params)
+{
+    BLE&        ble   = params->ble;
+    ble_error_t error = params->error;
+
+    if (error != BLE_ERROR_NONE) {
+        /* In case of error, forward the error handling to onBleInitError */
+        onBleInitError(ble, error);
+        return;
+    }
+
+    /* Ensure that it is the default instance of BLE */
+    if (ble.getInstanceID() != BLE::DEFAULT_INSTANCE) {
+        return;
+    }
+
+    ble.gap().onDisconnection(disconnectionCallback);
+    ble.gap().onConnection(connectionCallback);
+
+    // scan interval: 400ms and scan window: 400ms.
+    // Every 400ms the device will scan for 400ms
+    // This means that the device will scan continuously.
+    ble.gap().setScanParams(400, 400);
+    ble.gap().startScan(advertisementCallback);
+}
+
+
+int main(void) {
+    pc.baud(115200);
+    pc.printf("Initialization starts... \n");
+    
+    ticker.attach(periodicCallback, 1); /* Blink LED every second */
+    button.fall(buttonPressedCallback);
+    button.rise(buttonReleasedCallback);
+
+    BLE &ble = BLE::Instance();
+    ble.init(bleInitComplete);
+    
+    while (true) {
+        ble.waitForEvent();
+    }
+}
diff -r 000000000000 -r 26b1912de8d8 mbed.bld
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mbed.bld	Tue Aug 08 20:35:34 2017 +0000
@@ -0,0 +1,1 @@
+https://mbed.org/users/mbed_official/code/mbed/builds/a97add6d7e64
\ No newline at end of file
diff -r 000000000000 -r 26b1912de8d8 nRF51822.lib
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/nRF51822.lib	Tue Aug 08 20:35:34 2017 +0000
@@ -0,0 +1,1 @@
+http://mbed.org/teams/Nordic-Semiconductor/code/nRF51822/#c90ae1400bf2