Release 0.4.7

=============

* There's now a compile time switch to for handling for BLE stack events. For
  mbed OS, we now post callbacks to Minar, else stack events are executed
  right-away in interrupt context. In either case, the logic of event
  processing is identical--this means that the Nordic port of BLE_API will
  have the same code for mbed-classic and mbed OS. :)

  As a fallout of the above, all mbed-OS BLE event handling now happens in
  thread mode.
This commit is contained in:
Rohit Grover 2015-08-13 11:12:42 +01:00
commit 21e8e22df9
3 changed files with 30 additions and 7 deletions

View file

@ -1,6 +1,6 @@
{
"name": "ble-nrf51822",
"version": "0.4.6",
"version": "0.4.7",
"description": "Nordic stack and drivers for the mbed BLE API.",
"keywords": [
"Bluetooth",
@ -19,7 +19,7 @@
}
],
"dependencies": {
"ble": "~0.4.6"
"ble": "~0.4.7"
},
"extraIncludes": [
"source/btle",

View file

@ -50,6 +50,30 @@ static void sys_evt_dispatch(uint32_t sys_evt)
pstorage_sys_event_handler(sys_evt);
}
/**
* This function is called in interrupt context to handle BLE events; i.e. pull
* system and user events out of the pending events-queue of the BLE stack. The
* BLE stack signals the availability of events by the triggering the SWI2
* interrupt, which forwards the handling to this function.
*
* The event processing loop is implemented in intern_softdevice_events_execute().
*
* In mbed OS, a callback for intern_softdevice_events_execute() is posted
* to the scheduler, which then executes in thread mode. In mbed-classic,
* event processing happens right-away in interrupt context (which is more
* risk-prone). In either case, the logic of event processing is identical.
*/
static uint32_t eventHandler()
{
#ifdef YOTTA_CFG_MBED_OS
minar::Scheduler::postCallback(intern_softdevice_events_execute);
#else
intern_softdevice_events_execute();
#endif
return NRF_SUCCESS;
}
error_t btle_init(void)
{
nrf_clock_lfclksrc_t clockSource;
@ -58,7 +82,7 @@ error_t btle_init(void)
} else {
clockSource = NRF_CLOCK_LFCLKSRC_RC_250_PPM_4000MS_CALIBRATION;
}
SOFTDEVICE_HANDLER_INIT(clockSource, NULL);
SOFTDEVICE_HANDLER_INIT(clockSource, eventHandler);
// Enable BLE stack
/**

View file

@ -89,8 +89,7 @@ typedef void (*sys_evt_handler_t) (uint32_t evt_id);
* reinitialization).
*/
/*lint -emacro(506, SOFTDEVICE_HANDLER_INIT) */ /* Suppress "Constant value Boolean */
#define SOFTDEVICE_HANDLER_INIT(CLOCK_SOURCE, \
EVT_HANDLER) \
#define SOFTDEVICE_HANDLER_INIT(CLOCK_SOURCE, EVT_HANDLER) \
do \
{ \
static uint32_t BLE_EVT_BUFFER[CEIL_DIV(BLE_STACK_EVT_MSG_BUF_SIZE, sizeof(uint32_t))]; \
@ -98,7 +97,7 @@ typedef void (*sys_evt_handler_t) (uint32_t evt_id);
ERR_CODE = softdevice_handler_init((CLOCK_SOURCE), \
BLE_EVT_BUFFER, \
sizeof(BLE_EVT_BUFFER), \
EVT_HANDLER); \
EVT_HANDLER); \
APP_ERROR_CHECK(ERR_CODE); \
} while (0)
@ -117,7 +116,7 @@ typedef void (*sys_evt_handler_t) (uint32_t evt_id);
* used, this buffer must be provided by the application. The
* buffer must be large enough to hold the biggest stack event the
* application is supposed to handle. The buffer must be aligned to
* a 4 byte boundary. This parameter is unused if BLE stack support
* a 4 byte boundary. This parameter is unused if BLE stack support
* is not required.
* @param[in] ble_evt_buffer_size Size of SoftDevice BLE event buffer. This parameter is unused if
* BLE stack support is not required.