Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
107 commits
Select commit Hold shift + click to select a range
a1eab75
Updating mbed-os to mbed-os-5.11.0-rc1
adbridge Nov 29, 2018
719d413
update battery level to new API
paul-szczepanek-arm Nov 20, 2018
95532c6
beacon updated
paul-szczepanek-arm Nov 20, 2018
9460c4d
button demo updated
paul-szczepanek-arm Nov 20, 2018
4b0a1ec
missing virtual
paul-szczepanek-arm Nov 21, 2018
de12f0d
partial API update of gap
paul-szczepanek-arm Nov 21, 2018
eb37461
update advertising api
paul-szczepanek-arm Nov 22, 2018
c9cbe65
update scan params
paul-szczepanek-arm Nov 22, 2018
f0cb500
update api in button
paul-szczepanek-arm Nov 22, 2018
1a34ec9
update gattclient
paul-szczepanek-arm Nov 22, 2018
10aa534
heartrate api update
paul-szczepanek-arm Nov 22, 2018
b965440
make examples more uniform
paul-szczepanek-arm Nov 23, 2018
bb39940
fix compilation errors and updates to mbed-os
paul-szczepanek-arm Nov 26, 2018
d821f01
update enum names
paul-szczepanek-arm Nov 26, 2018
78bfe0c
apply more api updates
paul-szczepanek-arm Nov 26, 2018
1a0942b
only one adv builder needed
paul-szczepanek-arm Nov 26, 2018
d0a05fd
added advertising sets
paul-szczepanek-arm Nov 26, 2018
8b311d4
handle ending early due to connection with many sets
paul-szczepanek-arm Nov 26, 2018
5fd22e9
use non legacy pdu, check errors, different names
paul-szczepanek-arm Nov 26, 2018
b23287d
remove random type to make things simple
paul-szczepanek-arm Nov 26, 2018
463c9f4
don't destroy legacy
paul-szczepanek-arm Nov 27, 2018
a28d547
fix timeout too short
paul-szczepanek-arm Nov 27, 2018
0630421
stop scan before connect
paul-szczepanek-arm Nov 27, 2018
29c7d6a
correct performance ms measure
paul-szczepanek-arm Nov 27, 2018
736339f
use the correct disconnect
paul-szczepanek-arm Nov 27, 2018
d3c81cb
use data parser
paul-szczepanek-arm Nov 27, 2018
2904f50
remove leftover lines
paul-szczepanek-arm Nov 27, 2018
3b7922c
update api
paul-szczepanek-arm Nov 28, 2018
ead6a07
fix thermometer
paul-szczepanek-arm Nov 28, 2018
63beb09
fix onDisconnect callback
paul-szczepanek-arm Nov 28, 2018
ebbf8f0
use cordio LL for nordic
paul-szczepanek-arm Nov 28, 2018
c51a354
fix target names
paul-szczepanek-arm Nov 28, 2018
4b285ee
BLE_GAP: Use a random address type for all operations.
pan- Nov 28, 2018
d157ea8
BLE_Gap: simplify disconnect.
pan- Nov 28, 2018
0d24ca4
BLE: stop scan before connect.
pan- Nov 28, 2018
9cb8c5d
update bluenrg
paul-szczepanek-arm Nov 28, 2018
07742ef
Fix release of the blink event.
pan- Nov 28, 2018
a4812d8
fix error print
paul-szczepanek-arm Nov 29, 2018
9dde6e5
update privacy to new api
paul-szczepanek-arm Nov 29, 2018
35e6dfd
update sm
paul-szczepanek-arm Nov 29, 2018
196db7a
Revert "BLE: stop scan before connect."
paul-szczepanek-arm Nov 29, 2018
ff728ac
depreacted mbedignore
paul-szczepanek-arm Nov 29, 2018
65a7c03
update sm example
paul-szczepanek-arm Nov 29, 2018
387e92b
include deprecated examples
paul-szczepanek-arm Nov 29, 2018
8e6a0b6
use cordio LL
paul-szczepanek-arm Nov 29, 2018
6308f75
update mbed-os
paul-szczepanek-arm Nov 29, 2018
1553274
clarify example deprecation
paul-szczepanek-arm Nov 29, 2018
2fbc397
Fix demo.h (#4)
pan- Nov 30, 2018
678c334
BLE_GAP: Remove setOwnAddressType to random as this will get fixed in…
pan- Nov 29, 2018
88c4993
BLE_GAP: remove definition of connection params are reasonable defaul…
pan- Nov 29, 2018
62c55bb
BLE_GAP: Split dispatch end_demo_mode and print_performance.
pan- Nov 29, 2018
1cac09c
BLE_GAP: generalize array size computation.
pan- Nov 29, 2018
3a68546
BLE_GAP: use size helper where relevant.
pan- Nov 29, 2018
6bb576a
BLE_GAP: Use types in namespace ble where relevant.
pan- Nov 29, 2018
633c727
BLE_GAP: Set default phy if the feature is supported.
pan- Nov 29, 2018
e2efbaf
BLE_GAP: remove stop scan before connect
pan- Nov 29, 2018
abff0da
BLE_GAP: Reforctor branches in onAdvertisingReport.
pan- Nov 29, 2018
c21b540
BLE_GAP: rename variable.
pan- Nov 29, 2018
a069200
BLE_GAP: Use default connection params.
pan- Nov 29, 2018
486a322
BLE_GAP: Use inline declaration for ble::ScanParameters
pan- Nov 29, 2018
d6e2fb9
BLE_GAP: split legacy and extended advertising.
pan- Nov 29, 2018
5f6ce5d
BLE_GAP: Add helper to test features.
pan- Nov 29, 2018
a5531f6
BLE_GAP: split end_advertising into legacy and extended part.
pan- Nov 29, 2018
f847b99
BLE_GAP: Improve formating
pan- Nov 29, 2018
9081ac8
BLE_GAP: Improve security.
pan- Nov 29, 2018
4ce065a
BLE_GAP: Add direct accessor to ble::Gap.
pan- Nov 29, 2018
c6285ee
BLE_GAP: Fix message in print_scanning_performances.
pan- Nov 29, 2018
6d9a73c
Merge branch 'mbed-os-5.11.0-oob' into update-api
paul-szczepanek-arm Nov 30, 2018
3ebd772
calrify support for nrf51
paul-szczepanek-arm Nov 30, 2018
f9c6d80
typo
paul-szczepanek-arm Nov 30, 2018
03e5b9d
Merge pull request #196 from paul-szczepanek-arm/update-api
pan- Nov 30, 2018
d469b13
move deprecated outside the examples
paul-szczepanek-arm Nov 30, 2018
d4dc256
Merge pull request #197 from paul-szczepanek-arm/fixes-5.11.1
pan- Nov 30, 2018
59ef0e9
Updating mbed-os to mbed-os-5.11.0-rc2
adbridge Dec 5, 2018
f99c8bf
Fix compilation issue due to API breakage.
pan- Dec 7, 2018
b3baedf
Updating mbed-os to mbed-os-5.11.0-rc3
adbridge Dec 12, 2018
234043b
Updating mbed-os to mbed-os-5.11.0-rc4
Dec 13, 2018
4a02570
Update README.md
Dec 14, 2018
934f060
Merge branch 'mbed-os-5.11.0-oob' into donatieng-patch-3
Dec 14, 2018
a73a57c
Merge pull request #204 from ARMmbed/donatieng-patch-3
Dec 14, 2018
51c65e0
Merge branch 'master' into mbed-os-5.11.0-oob
Jan 7, 2019
300143b
remove redundant files
paul-szczepanek-arm Jan 7, 2019
c2f3ce4
update bluenrg lib
paul-szczepanek-arm Jan 7, 2019
60ba7fd
fix hash in .lib
paul-szczepanek-arm Jan 7, 2019
6646014
Merge pull request #209 from paul-szczepanek-arm/oob-fix
pan- Jan 7, 2019
83fc2eb
fix after event rename
paul-szczepanek-arm Nov 30, 2018
73afcc6
wrong event updated fixed
paul-szczepanek-arm Nov 30, 2018
76f49b2
periodic advertising added
paul-szczepanek-arm Dec 4, 2018
dde9282
update to api fixes
paul-szczepanek-arm Dec 4, 2018
2ecc04c
handle syncing alongside connecting
paul-szczepanek-arm Dec 4, 2018
eb6b496
fix timing
paul-szczepanek-arm Dec 5, 2018
69eee69
don't remake sets
paul-szczepanek-arm Dec 5, 2018
d34993f
stray paren
paul-szczepanek-arm Dec 5, 2018
030ca0b
fix nma comparison
paul-szczepanek-arm Dec 5, 2018
bebdc62
fix name comparison
paul-szczepanek-arm Dec 6, 2018
e6166a3
add periodic demo readme
paul-szczepanek-arm Dec 6, 2018
b1bddb6
timeouts now work
paul-szczepanek-arm Dec 7, 2018
a485f4f
fix per example flow
paul-szczepanek-arm Dec 8, 2018
7293b76
omit reports without periodic interval
paul-szczepanek-arm Dec 8, 2018
c22576d
fixed periodic
paul-szczepanek-arm Dec 9, 2018
11e17a0
remove redundant lines
paul-szczepanek-arm Dec 9, 2018
8cff36f
use corret macro for button
paul-szczepanek-arm Jan 3, 2019
bd55fe4
remove toolchain and arch from .mbed
paul-szczepanek-arm Jan 3, 2019
ccab5f0
update .lib bluenrg
paul-szczepanek-arm Jan 7, 2019
1090ea5
set own addr type to random instead of public
paul-szczepanek-arm Jan 7, 2019
7b4c549
typo in func name
paul-szczepanek-arm Jan 7, 2019
4240d47
update mbedos .lib
paul-szczepanek-arm Jan 7, 2019
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 16 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -31,3 +31,19 @@ build/
yotta_modules/
yotta_targets/
.DS_Store

# clion
.idea/
cmake-build-*/
CMakeLists.txt

# exporters
GettingStarted.html

# mbed build system
mbed-os/
mbed_settings.py
mbed_config.h
*.pyc
TARGET_CORDIO_BLUENRG/

2 changes: 1 addition & 1 deletion BLE_BatteryLevel/mbed-os.lib
Original file line number Diff line number Diff line change
@@ -1 +1 @@
https://github.com/ARMmbed/mbed-os/#2fd0c5cfbd83fce62da6308f9d64c0ab64e1f0d6
https://github.com/ARMmbed/mbed-os/#6a0a86538c0b9b2bfcc4583b1e2b7fea8f4e71e9
10 changes: 10 additions & 0 deletions BLE_BatteryLevel/mbed_app.json
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,16 @@
"DISCO_L475VG_IOT01A": {
"target.features_add": ["BLE"],
"target.extra_labels_add": ["CORDIO", "CORDIO_BLUENRG"]
},
"NRF52840_DK": {
"target.features_add": ["BLE"],
"target.extra_labels_add": ["CORDIO", "CORDIO_LL", "SOFTDEVICE_NONE", "NORDIC_CORDIO"],
"target.extra_labels_remove": ["SOFTDEVICE_COMMON", "SOFTDEVICE_S140_FULL", "NORDIC_SOFTDEVICE"]
},
"NRF52_DK": {
"target.features_add": ["BLE"],
"target.extra_labels_add": ["CORDIO", "CORDIO_LL", "SOFTDEVICE_NONE", "NORDIC_CORDIO"],
"target.extra_labels_remove": ["SOFTDEVICE_COMMON", "SOFTDEVICE_S132_FULL", "NORDIC_SOFTDEVICE"]
}
}
}
2 changes: 1 addition & 1 deletion BLE_BatteryLevel/shields/TARGET_CORDIO_BLUENRG.lib
Original file line number Diff line number Diff line change
@@ -1 +1 @@
https://github.com/ARMmbed/cordio-ble-x-nucleo-idb0xa1/#51f60dfea514e35e5aa13c8e24005ecadc24a9f5
https://github.com/ARMmbed/cordio-ble-x-nucleo-idb0xa1/#811f3fea7aa8083c0bbf378e1b51a8b131d7efcc
178 changes: 103 additions & 75 deletions BLE_BatteryLevel/source/main.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -19,111 +19,139 @@
#include "ble/BLE.h"
#include "ble/Gap.h"
#include "ble/services/BatteryService.h"
#include "pretty_printer.h"

DigitalOut led1(LED1, 1);
static DigitalOut led1(LED1, 1);

const static char DEVICE_NAME[] = "BATTERY";
static const uint16_t uuid16_list[] = {GattService::UUID_BATTERY_SERVICE};
const static char DEVICE_NAME[] = "BATTERY";

static uint8_t batteryLevel = 50;
static BatteryService* batteryServicePtr;
static events::EventQueue event_queue(/* event count */ 16 * EVENTS_EVENT_SIZE);

static EventQueue eventQueue(/* event count */ 16 * EVENTS_EVENT_SIZE);
class BatteryDemo : ble::Gap::EventHandler {
public:
BatteryDemo(BLE &ble, events::EventQueue &event_queue) :
_ble(ble),
_event_queue(event_queue),
_battery_uuid(GattService::UUID_BATTERY_SERVICE),
_battery_level(50),
_battery_service(ble, _battery_level),
_adv_data_builder(_adv_buffer) { }

void disconnectionCallback(const Gap::DisconnectionCallbackParams_t *params)
{
BLE::Instance().gap().startAdvertising();
}
void start() {
_ble.gap().setEventHandler(this);

_ble.init(this, &BatteryDemo::on_init_complete);

_event_queue.call_every(500, this, &BatteryDemo::blink);
_event_queue.call_every(1000, this, &BatteryDemo::update_sensor_value);

void updateSensorValue() {
batteryLevel++;
if (batteryLevel > 100) {
batteryLevel = 20;
_event_queue.dispatch_forever();
}

batteryServicePtr->updateBatteryLevel(batteryLevel);
}
private:
/** Callback triggered when the ble initialization process has finished */
void on_init_complete(BLE::InitializationCompleteCallbackContext *params) {
if (params->error != BLE_ERROR_NONE) {
print_error(params->error, "Ble initialization failed.");
return;
}

void blinkCallback(void)
{
led1 = !led1; /* Do blinky on LED1 while we're waiting for BLE events */
print_mac_address();

BLE &ble = BLE::Instance();
if (ble.gap().getState().connected) {
eventQueue.call(updateSensorValue);
start_advertising();
}
}

/**
* This function is called when the ble initialization process has failled
*/
void onBleInitError(BLE &ble, ble_error_t error)
{
/* Initialization error handling should go here */
}
void start_advertising() {
/* Create advertising parameters and payload */

void printMacAddress()
{
/* Print out device MAC address to the console*/
Gap::AddressType_t addr_type;
Gap::Address_t address;
BLE::Instance().gap().getAddress(&addr_type, address);
printf("DEVICE MAC ADDRESS: ");
for (int i = 5; i >= 1; i--){
printf("%02x:", address[i]);
ble::AdvertisingParameters adv_parameters(
ble::advertising_type_t::CONNECTABLE_UNDIRECTED,
ble::adv_interval_t(ble::millisecond_t(1000))
);

_adv_data_builder.setFlags();
_adv_data_builder.setLocalServiceList(mbed::make_Span(&_battery_uuid, 1));
_adv_data_builder.setName(DEVICE_NAME);

/* Setup advertising */

ble_error_t error = _ble.gap().setAdvertisingParameters(
ble::LEGACY_ADVERTISING_HANDLE,
adv_parameters
);

if (error) {
print_error(error, "_ble.gap().setAdvertisingParameters() failed");
return;
}

error = _ble.gap().setAdvertisingPayload(
ble::LEGACY_ADVERTISING_HANDLE,
_adv_data_builder.getAdvertisingData()
);

if (error) {
print_error(error, "_ble.gap().setAdvertisingPayload() failed");
return;
}

/* Start advertising */

error = _ble.gap().startAdvertising(ble::LEGACY_ADVERTISING_HANDLE);

if (error) {
print_error(error, "_ble.gap().startAdvertising() failed");
return;
}
}
printf("%02x\r\n", address[0]);
}

/**
* Callback triggered when the ble initialization process has finished
*/
void bleInitComplete(BLE::InitializationCompleteCallbackContext *params)
{
BLE& ble = params->ble;
ble_error_t error = params->error;
void update_sensor_value() {
if (_ble.gap().getState().connected) {
_battery_level++;
if (_battery_level > 100) {
_battery_level = 20;
}

if (error != BLE_ERROR_NONE) {
/* In case of error, forward the error handling to onBleInitError */
onBleInitError(ble, error);
return;
_battery_service.updateBatteryLevel(_battery_level);
}
}

/* Ensure that it is the default instance of BLE */
if(ble.getInstanceID() != BLE::DEFAULT_INSTANCE) {
return;
void blink(void) {
led1 = !led1;
}

ble.gap().onDisconnection(disconnectionCallback);
private:
/* Event handler */

/* Setup primary service */
batteryServicePtr = new BatteryService(ble, batteryLevel);
void onDisconnectionComplete(const ble::DisconnectionCompleteEvent&) {
_ble.gap().startAdvertising(ble::LEGACY_ADVERTISING_HANDLE);
}

/* Setup advertising */
ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::BREDR_NOT_SUPPORTED | GapAdvertisingData::LE_GENERAL_DISCOVERABLE);
ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LIST_16BIT_SERVICE_IDS, (uint8_t *) uuid16_list, sizeof(uuid16_list));
ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LOCAL_NAME, (uint8_t *) DEVICE_NAME, sizeof(DEVICE_NAME));
ble.gap().setAdvertisingType(GapAdvertisingParams::ADV_CONNECTABLE_UNDIRECTED);
ble.gap().setAdvertisingInterval(1000); /* 1000ms */
ble.gap().startAdvertising();
private:
BLE &_ble;
events::EventQueue &_event_queue;

printMacAddress();
}
UUID _battery_uuid;

void scheduleBleEventsProcessing(BLE::OnEventsToProcessCallbackContext* context) {
BLE &ble = BLE::Instance();
eventQueue.call(Callback<void()>(&ble, &BLE::processEvents));
uint8_t _battery_level;
BatteryService _battery_service;

uint8_t _adv_buffer[ble::LEGACY_ADVERTISING_MAX_SIZE];
ble::AdvertisingDataBuilder _adv_data_builder;
};

/** Schedule processing of events from the BLE middleware in the event queue. */
void schedule_ble_events(BLE::OnEventsToProcessCallbackContext *context) {
event_queue.call(Callback<void()>(&context->ble, &BLE::processEvents));
}

int main()
{
eventQueue.call_every(500, blinkCallback);

BLE &ble = BLE::Instance();
ble.onEventsToProcess(scheduleBleEventsProcessing);
ble.init(bleInitComplete);
ble.onEventsToProcess(schedule_ble_events);

eventQueue.dispatch_forever();
BatteryDemo demo(ble, event_queue);
demo.start();

return 0;
}
95 changes: 95 additions & 0 deletions BLE_BatteryLevel/source/pretty_printer.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,95 @@
/* mbed Microcontroller Library
* Copyright (c) 2018 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"

inline 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");
}

/** print device address to the terminal */
inline void print_address(const Gap::Address_t &addr)
{
printf("%02x:%02x:%02x:%02x:%02x:%02x\r\n",
addr[5], addr[4], addr[3], addr[2], addr[1], addr[0]);
}

inline void print_mac_address()
{
/* Print out device MAC address to the console*/
Gap::AddressType_t addr_type;
Gap::Address_t address;
BLE::Instance().gap().getAddress(&addr_type, address);
printf("DEVICE MAC ADDRESS: ");
print_address(address);
}

inline const char* phy_to_string(Gap::Phy_t phy) {
switch(phy.value()) {
case Gap::Phy_t::LE_1M:
return "LE 1M";
case Gap::Phy_t::LE_2M:
return "LE 2M";
case Gap::Phy_t::LE_CODED:
return "LE coded";
default:
return "invalid PHY";
}
}
2 changes: 1 addition & 1 deletion BLE_Beacon/mbed-os.lib
Original file line number Diff line number Diff line change
@@ -1 +1 @@
https://github.com/ARMmbed/mbed-os/#2fd0c5cfbd83fce62da6308f9d64c0ab64e1f0d6
https://github.com/ARMmbed/mbed-os/#6a0a86538c0b9b2bfcc4583b1e2b7fea8f4e71e9
10 changes: 10 additions & 0 deletions BLE_Beacon/mbed_app.json
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,16 @@
"DISCO_L475VG_IOT01A": {
"target.features_add": ["BLE"],
"target.extra_labels_add": ["CORDIO", "CORDIO_BLUENRG"]
},
"NRF52840_DK": {
"target.features_add": ["BLE"],
"target.extra_labels_add": ["CORDIO", "CORDIO_LL", "SOFTDEVICE_NONE", "NORDIC_CORDIO"],
"target.extra_labels_remove": ["SOFTDEVICE_COMMON", "SOFTDEVICE_S140_FULL", "NORDIC_SOFTDEVICE"]
},
"NRF52_DK": {
"target.features_add": ["BLE"],
"target.extra_labels_add": ["CORDIO", "CORDIO_LL", "SOFTDEVICE_NONE", "NORDIC_CORDIO"],
"target.extra_labels_remove": ["SOFTDEVICE_COMMON", "SOFTDEVICE_S132_FULL", "NORDIC_SOFTDEVICE"]
}
}
}
2 changes: 1 addition & 1 deletion BLE_Beacon/shields/TARGET_CORDIO_BLUENRG.lib
Original file line number Diff line number Diff line change
@@ -1 +1 @@
https://github.com/ARMmbed/cordio-ble-x-nucleo-idb0xa1/#51f60dfea514e35e5aa13c8e24005ecadc24a9f5
https://github.com/ARMmbed/cordio-ble-x-nucleo-idb0xa1/#811f3fea7aa8083c0bbf378e1b51a8b131d7efcc
Loading