=============
* 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.
- add a space after if keyword
- Use typedef types instead of direct declarations for
pFunctionPointerWithContext_t and pvoidfcontext_t
- Fix typos and enhance comment about how alignement and size
requirements of the member function pointer are computed.
bytes (oryginally, it was 32 bytes !).
Enforce alignement constraints of the embedded pointer to member function.
Symplify and unify call mecanic, everything is delegated uniformally to the actual
implementation.
Introduced a fix for defect IOTSFW-1058 that caused the
BLE_EddystoneBeaconConfigService example in ARMmbed/ble-examples repo to fail.
Refer to JIRA defect for more details.
=============
* Introduce an Instance() class method to BLE to allow access to the BLE
singleton(s) using instanceID. Calling BLE::Instance() is preferable to
constructing a BLE object directly because Instance() returns references to
internally created singletons.
* We've added an initial prototype for a yotta-config based initialization for BLE transports.
It is conceivable to have multiple BLE transports available to a system
concurrently in which case Instance() can be passed an instanceID.
There's also a BLE::NUM_INSTANCES--instanceID passed to Instance() should be
less than NUM_INSTANCES for the returned BLE singleton to be useful.
The config system now allows the target to specify multiple BLE instances.
BLE::Instance() and BLE constructor rely upon a static array of initializers
to create actual BLE transport instances. A description of these instances
and initializers is supposed to be put in some .json file contributing to
yotta's configuration (typically the target.json). Here's a sample:
"config": {
...
"ble_instances": {
"count": 1,
"0" : {
"initializer" : "createBLEInstance"
}
}
}
Refer to http://yottadocs.mbed.com/reference/config.html.
Note: The configuration system is currently experimental. Some of the
behaviour described below may change in backwards-incompatible ways with
minor updates to yotta.
The use of this feature is optional. Initialization would continue to work
like before as long as there is a default createBLEInstance() method
available.
* We've updated our support for Google's Eddystone beacon by adding the EddystoneConfigService.
* Added onConnection() and onDisconnection() now append to a callback chain internally.
Please note that this has also changed the callbackType for onDisconnection; resulting in a minor breaking change for API.
All previous programs using onDisconnection() would need to adapt.
* Handle the case of a NULL transport pointer for BLE.
* We now disallow copy constructor and assignment operator for BLE.