=============
* Major change to the APIs around stack initialization. BLE::init() is now
meant to only trigger the initialization of the underlying BLE stack. init()
now takes a completion callback as an optional parameter; this callback gets
invoked when initialization completes.
- There's a new type: BLE::InitializationCompleteCallback_t
- There's a new API: BLEInstanceBase::hasInitialized() which transports
need to implement.
- If no init-completion callback is setup, the application can still
determine the status of initialization using BLE::hasInitialized().
!This update may require in a minor change to existing apps!
mbed-classic demos would look something like:
```
main() {
BLE::Instance().init();
while (!BLE::Instance().hasInitialized()) {
/* spin wait */
}
/* rest of the initialization ending in the waitForEvent loop */
}
```
whereas mbedOS demos would look like:
```
void bleInitComplete(BLE &ble, ble_error_t error)
{
WsfTrace("bleInitComplete");
if (error != BLE_ERROR_NONE) {
WsfTrace("initailization failed with error: %u", error);
return;
}
if (ble.getInstanceID() == BLE::DEFAULT_INSTANCE) {
/* use the BLE instance */
}
}
extern "C" void app_start(int argc, char *argv[])
{
BLE::Instance().init(bleInitComplete);
}
```
The Nordic stack initializes right-away, and so existing demos based on Nordic should continue to work.
* There's a new API: BLE::getInstanceID(), which simply returns the ID of an
instance.
* Reduce the memory footprint consumed by a FunctionPointerWithContext to 20
bytes (originally, it was 32 bytes !). Also enforce alignment constraints
of the embedded pointer to member function. This should help with the size
of a GattCharacteristic.
* Add EnvironmentalService.h under services/.
* There have been minor improvements to EddystoneService and EddystoneConfigService.
* We've added a CONTRIBUTING.md to help guide user contributions.
- There's a new type: BLE::InitializationCompleteCallback_t
- init() now takes a completion callback. This is an optional parameter, if no callback is setup the application can still determine the status of initialization using BLE::hasInitialized() (see below).
- There's a new API: BLEInstanceBase::hasInitialized() which transports need to implement.
- BLEInstanceBase.h is no longer included from BLE.h. We use a forward declaration of BLEInstanceBase instead. This is required us to move implementations of BLE methods out of the header and into BLE.cpp.
- There's a new API: BLE::getInstanceID(), which simply returns the ID of an instance.
- There are new error types around initialization.