blob: b14a3582a40e66240619ca9a84d79facc98d39f4 [file] [log] [blame]
Respond to *sync* and *reset* events
------------------------------------
sync
~~~~
The NimBLE stack is inoperable while the host and controller are out of
sync. In a combined host-controller app, the sync happens immediately at
startup. When the host and controller are separate, sync typically
occurs in under a second after the application starts. An application
learns when sync is achieved by configuring the host's *sync callback*:
``ble_hs_cfg.sync_cb``. The host calls the sync callback whenever sync
is acquired. The sync callback has the following form:
.. code-block:: cpp
typedef void ble_hs_sync_fn(void);
Because the NimBLE stack begins in the unsynced state, the application
should delay all BLE operations until the sync callback has been called.
reset
~~~~~
Another event indicated by the host is a *controller reset*. The NimBLE
stack resets itself when a catastrophic error occurs, such as loss of
communication between the host and controller. Upon resetting, the host
drops all BLE connections and loses sync with the controller. After a
reset, the application should refrain from using the host until sync is
again signaled via the sync callback.
An application learns of a host reset by configuring the host's *reset
callback*: ``ble_hs_cfg.reset_cb``. This callback has the following
form:
.. code-block:: cpp
typedef void ble_hs_reset_fn(int reason);
The ``reason`` parameter is a :doc:`NimBLE host return
code <../ble_hs/ble_hs_return_codes>`.
Example
~~~~~~~
The following example demonstrates the configuration of the sync and
reset callbacks.
.. code-block:: cpp
#include "sysinit/sysinit.h"
#include "console/console.h"
#include "host/ble_hs.h"
static void
on_sync(void)
{
/* Begin advertising, scanning for peripherals, etc. */
}
static void
on_reset(int reason)
{
console_printf("Resetting state; reason=%d\n", reason);
}
int
main(void)
{
/* Initialize all packages. */
sysinit();
ble_hs_cfg.sync_cb = on_sync;
ble_hs_cfg.reset_cb = on_reset;
/* As the last thing, process events from default event queue. */
while (1) {
os_eventq_run(os_eventq_dflt_get());
}
}