You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mynewt.apache.org by cc...@apache.org on 2016/11/01 17:16:45 UTC
[02/11] incubator-mynewt-core git commit: BLE Host: Event codes ->
callbacks
BLE Host: Event codes -> callbacks
Project: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/commit/17eded92
Tree: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/tree/17eded92
Diff: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/diff/17eded92
Branch: refs/heads/develop
Commit: 17eded92b71b4ca80a38553cc7938200595094e9
Parents: 918811f
Author: Christopher Collins <cc...@apache.org>
Authored: Thu Oct 27 16:10:21 2016 -0700
Committer: Christopher Collins <cc...@apache.org>
Committed: Tue Nov 1 10:06:43 2016 -0700
----------------------------------------------------------------------
net/nimble/host/include/host/ble_hs.h | 3 +-
net/nimble/host/pkg.yml | 1 -
net/nimble/host/src/ble_hs.c | 148 ++++++++++++-----------
net/nimble/host/src/ble_hs_cfg.c | 2 -
net/nimble/host/src/ble_hs_priv.h | 1 +
net/nimble/host/test/src/ble_hs_test_util.c | 4 +-
net/nimble/host/test/src/ble_os_test.c | 19 +--
7 files changed, 84 insertions(+), 94 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/17eded92/net/nimble/host/include/host/ble_hs.h
----------------------------------------------------------------------
diff --git a/net/nimble/host/include/host/ble_hs.h b/net/nimble/host/include/host/ble_hs.h
index ca6bf01..34400f1 100644
--- a/net/nimble/host/include/host/ble_hs.h
+++ b/net/nimble/host/include/host/ble_hs.h
@@ -98,8 +98,6 @@ typedef void ble_hs_reset_fn(int reason);
typedef void ble_hs_sync_fn(void);
struct ble_hs_cfg {
- struct os_eventq *parent_evq;
-
/*** GATT server settings. */
/**
* An optional callback that gets executed upon registration of each GATT
@@ -155,6 +153,7 @@ extern struct ble_hs_cfg ble_hs_cfg;
int ble_hs_synced(void);
int ble_hs_start(void);
+void ble_hs_evq_set(struct os_eventq *evq);
void ble_hs_init(void);
#ifdef __cplusplus
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/17eded92/net/nimble/host/pkg.yml
----------------------------------------------------------------------
diff --git a/net/nimble/host/pkg.yml b/net/nimble/host/pkg.yml
index 57170f3..377a3a7 100644
--- a/net/nimble/host/pkg.yml
+++ b/net/nimble/host/pkg.yml
@@ -30,7 +30,6 @@ pkg.deps:
- net/nimble
- sys/log
- sys/stats
- - util/childq
pkg.deps.BLE_SM:
- crypto/mbedtls
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/17eded92/net/nimble/host/src/ble_hs.c
----------------------------------------------------------------------
diff --git a/net/nimble/host/src/ble_hs.c b/net/nimble/host/src/ble_hs.c
index 3974acc..63b04ed 100644
--- a/net/nimble/host/src/ble_hs.c
+++ b/net/nimble/host/src/ble_hs.c
@@ -19,12 +19,12 @@
#include <assert.h>
#include <errno.h>
+#include <string.h>
#include "sysinit/sysinit.h"
#include "syscfg/syscfg.h"
#include "bsp/bsp.h"
#include "stats/stats.h"
#include "os/os.h"
-#include "childq/childq.h"
#include "nimble/ble_hci_trans.h"
#include "ble_hs_priv.h"
@@ -32,11 +32,10 @@
(MYNEWT_VAL(BLE_HCI_EVT_HI_BUF_COUNT) + \
MYNEWT_VAL(BLE_HCI_EVT_LO_BUF_COUNT))
-/**
- * The maximum number of events the host will process in a row before returning
- * control to the parent task.
- */
-#define BLE_HS_MAX_EVS_IN_A_ROW 2
+static void ble_hs_event_rx_hci_ev(struct os_event *ev);
+static void ble_hs_event_tx_notify(struct os_event *ev);
+static void ble_hs_event_reset(struct os_event *ev);
+static void ble_hs_event_start(struct os_event *ev);
struct os_mempool ble_hs_hci_ev_pool;
static os_membuf_t ble_hs_hci_os_event_buf[
@@ -44,15 +43,17 @@ static os_membuf_t ble_hs_hci_os_event_buf[
];
/** OS event - triggers tx of pending notifications and indications. */
-static struct os_event ble_hs_event_tx_notifications = {
- .ev_type = BLE_HS_EVENT_TX_NOTIFICATIONS,
- .ev_arg = NULL,
+static struct os_event ble_hs_ev_tx_notifications = {
+ .ev_cb = ble_hs_event_tx_notify,
};
/** OS event - triggers a full reset. */
-static struct os_event ble_hs_event_reset = {
- .ev_type = BLE_HS_EVENT_RESET,
- .ev_arg = NULL,
+static struct os_event ble_hs_ev_reset = {
+ .ev_cb = ble_hs_event_reset,
+};
+
+static struct os_event ble_hs_ev_start = {
+ .ev_cb = ble_hs_event_start,
};
uint8_t ble_hs_sync_state;
@@ -69,10 +70,10 @@ static struct os_task *ble_hs_parent_task;
* Handles unresponsive timeouts and periodic retries in case of resource
* shortage.
*/
-static struct os_callout_func ble_hs_heartbeat_timer;
+static struct os_callout ble_hs_heartbeat_timer;
-/* Queue for host-specific OS events. */
-static struct childq ble_hs_cq;
+/* Shared queue that the host uses for work items. */
+static struct os_eventq *ble_hs_evq;
static struct os_mqueue ble_hs_rx_q;
static struct os_mqueue ble_hs_tx_q;
@@ -104,6 +105,19 @@ STATS_NAME_START(ble_hs_stats)
STATS_NAME(ble_hs_stats, sync)
STATS_NAME_END(ble_hs_stats)
+static struct os_eventq *
+ble_hs_evq_get(void)
+{
+ os_eventq_ensure(&ble_hs_evq, &ble_hs_ev_start);
+ return ble_hs_evq;
+}
+
+void
+ble_hs_evq_set(struct os_eventq *evq)
+{
+ os_eventq_designate(&ble_hs_evq, evq, &ble_hs_ev_start);
+}
+
int
ble_hs_locked_by_cur_task(void)
{
@@ -200,7 +214,7 @@ ble_hs_heartbeat_timer_reset(uint32_t ticks)
{
int rc;
- rc = os_callout_reset(&ble_hs_heartbeat_timer.cf_c, ticks);
+ rc = os_callout_reset(&ble_hs_heartbeat_timer, ticks);
BLE_HS_DBG_ASSERT_EVAL(rc == 0);
}
@@ -214,8 +228,8 @@ ble_hs_heartbeat_sched(int32_t ticks_from_now)
/* Reset heartbeat timer if it is not currently scheduled or if the
* specified time is sooner than the current expiration time.
*/
- if (!os_callout_queued(&ble_hs_heartbeat_timer.cf_c) ||
- OS_TIME_TICK_LT(ticks_from_now, ble_hs_heartbeat_timer.cf_c.c_ticks)) {
+ if (!os_callout_queued(&ble_hs_heartbeat_timer) ||
+ OS_TIME_TICK_LT(ticks_from_now, ble_hs_heartbeat_timer.c_ticks)) {
ble_hs_heartbeat_timer_reset(ticks_from_now);
}
@@ -305,7 +319,7 @@ ble_hs_reset(void)
* timeouts and periodic retries in case of resource shortage.
*/
static void
-ble_hs_heartbeat(void *unused)
+ble_hs_heartbeat(struct os_event *ev)
{
int32_t ticks_until_next;
@@ -335,52 +349,41 @@ ble_hs_heartbeat(void *unused)
}
static void
-ble_hs_event_handle(struct os_event *ev)
+ble_hs_event_rx_hci_ev(struct os_event *ev)
{
- struct os_callout_func *cf;
uint8_t *hci_evt;
int rc;
- switch (ev->ev_type) {
- case OS_EVENT_T_TIMER:
- cf = (struct os_callout_func *)ev;
- assert(cf->cf_func);
- cf->cf_func(ev->ev_arg);
- break;
-
- case BLE_HOST_HCI_EVENT_CTLR_EVENT:
- hci_evt = ev->ev_arg;
- rc = os_memblock_put(&ble_hs_hci_ev_pool, ev);
- BLE_HS_DBG_ASSERT_EVAL(rc == 0);
-
- ble_hs_hci_evt_process(hci_evt);
- break;
+ hci_evt = ev->ev_arg;
+ rc = os_memblock_put(&ble_hs_hci_ev_pool, ev);
+ BLE_HS_DBG_ASSERT_EVAL(rc == 0);
- case BLE_HS_EVENT_TX_NOTIFICATIONS:
- BLE_HS_DBG_ASSERT(ev == &ble_hs_event_tx_notifications);
- ble_gatts_tx_notifications();
- break;
+ ble_hs_hci_evt_process(hci_evt);
+}
- case OS_EVENT_T_MQUEUE_DATA:
- ble_hs_process_tx_data_queue();
- ble_hs_process_rx_data_queue();
- break;
+static void
+ble_hs_event_tx_notify(struct os_event *ev)
+{
+ ble_gatts_tx_notifications();
+}
- case BLE_HS_EVENT_RESET:
- BLE_HS_DBG_ASSERT(ev == &ble_hs_event_reset);
- ble_hs_reset();
- break;
+static void
+ble_hs_event_data(struct os_event *ev)
+{
+ ble_hs_process_tx_data_queue();
+ ble_hs_process_rx_data_queue();
+}
- default:
- BLE_HS_DBG_ASSERT(0);
- break;
- }
+static void
+ble_hs_event_reset(struct os_event *ev)
+{
+ ble_hs_reset();
}
-void
-ble_hs_event_enqueue(struct os_event *ev)
+static void
+ble_hs_event_start(struct os_event *ev)
{
- childq_put(&ble_hs_cq, ev);
+ ble_hs_start();
}
void
@@ -393,9 +396,9 @@ ble_hs_enqueue_hci_event(uint8_t *hci_evt)
ble_hci_trans_buf_free(hci_evt);
} else {
ev->ev_queued = 0;
- ev->ev_type = BLE_HOST_HCI_EVENT_CTLR_EVENT;
+ ev->ev_cb = ble_hs_event_rx_hci_ev,
ev->ev_arg = hci_evt;
- ble_hs_event_enqueue(ev);
+ os_eventq_put(ble_hs_evq_get(), ev);
}
}
@@ -413,7 +416,7 @@ ble_hs_notifications_sched(void)
}
#endif
- ble_hs_event_enqueue(&ble_hs_event_tx_notifications);
+ os_eventq_put(ble_hs_evq_get(), &ble_hs_ev_tx_notifications);
}
void
@@ -422,7 +425,7 @@ ble_hs_sched_reset(int reason)
BLE_HS_DBG_ASSERT(ble_hs_reset_reason == 0);
ble_hs_reset_reason = reason;
- ble_hs_event_enqueue(&ble_hs_event_reset);
+ os_eventq_put(ble_hs_evq_get(), &ble_hs_ev_reset);
}
void
@@ -449,14 +452,10 @@ ble_hs_start(void)
{
int rc;
- if (ble_hs_cfg.parent_evq == NULL) {
- return BLE_HS_EINVAL;
- }
-
ble_hs_parent_task = os_sched_get_current_task();
- os_callout_func_init(&ble_hs_heartbeat_timer, ble_hs_cfg.parent_evq,
- ble_hs_heartbeat, NULL);
+ os_callout_init(&ble_hs_heartbeat_timer, ble_hs_evq_get(),
+ ble_hs_heartbeat, NULL);
rc = ble_att_svr_start();
if (rc != 0) {
@@ -490,7 +489,7 @@ ble_hs_rx_data(struct os_mbuf *om, void *arg)
{
int rc;
- rc = childq_put_mqueue(&ble_hs_cq, &ble_hs_rx_q, om);
+ rc = os_mqueue_put(&ble_hs_rx_q, ble_hs_evq_get(), om);
if (rc != 0) {
os_mbuf_free_chain(om);
return BLE_HS_EOS;
@@ -513,7 +512,7 @@ ble_hs_tx_data(struct os_mbuf *om)
{
int rc;
- rc = childq_put_mqueue(&ble_hs_cq, &ble_hs_tx_q, om);
+ rc = os_mqueue_put(&ble_hs_tx_q, ble_hs_evq_get(), om);
if (rc != 0) {
os_mbuf_free_chain(om);
return BLE_HS_EOS;
@@ -542,7 +541,18 @@ ble_hs_init(void)
"ble_hs_hci_ev_pool");
SYSINIT_PANIC_ASSERT(rc == 0);
- childq_init(&ble_hs_cq, ble_hs_cfg.parent_evq, ble_hs_event_handle);
+ /* These get initialized here to allow unit tests to run without a zeroed
+ * bss.
+ */
+ ble_hs_ev_tx_notifications = (struct os_event) {
+ .ev_cb = ble_hs_event_tx_notify,
+ };
+ ble_hs_ev_reset = (struct os_event) {
+ .ev_cb = ble_hs_event_reset,
+ };
+ ble_hs_ev_start = (struct os_event) {
+ .ev_cb = ble_hs_event_start,
+ };
ble_hs_hci_init();
@@ -567,8 +577,8 @@ ble_hs_init(void)
rc = ble_gatts_init();
SYSINIT_PANIC_ASSERT(rc == 0);
- os_mqueue_init(&ble_hs_rx_q, NULL);
- os_mqueue_init(&ble_hs_tx_q, NULL);
+ os_mqueue_init(&ble_hs_rx_q, ble_hs_event_data, NULL);
+ os_mqueue_init(&ble_hs_tx_q, ble_hs_event_data, NULL);
rc = stats_init_and_reg(
STATS_HDR(ble_hs_stats), STATS_SIZE_INIT_PARMS(ble_hs_stats,
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/17eded92/net/nimble/host/src/ble_hs_cfg.c
----------------------------------------------------------------------
diff --git a/net/nimble/host/src/ble_hs_cfg.c b/net/nimble/host/src/ble_hs_cfg.c
index b8d19f9..a46a604 100644
--- a/net/nimble/host/src/ble_hs_cfg.c
+++ b/net/nimble/host/src/ble_hs_cfg.c
@@ -21,8 +21,6 @@
#include "host/ble_hs.h"
struct ble_hs_cfg ble_hs_cfg = {
- .parent_evq = NULL,
-
/** Security manager settings. */
.sm_io_cap = MYNEWT_VAL(BLE_SM_IO_CAP),
.sm_oob_data_flag = MYNEWT_VAL(BLE_SM_OOB_DATA_FLAG),
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/17eded92/net/nimble/host/src/ble_hs_priv.h
----------------------------------------------------------------------
diff --git a/net/nimble/host/src/ble_hs_priv.h b/net/nimble/host/src/ble_hs_priv.h
index 723c164..1aa4d5d 100644
--- a/net/nimble/host/src/ble_hs_priv.h
+++ b/net/nimble/host/src/ble_hs_priv.h
@@ -57,6 +57,7 @@ struct os_event;
#define BLE_HOST_HCI_EVENT_CTLR_EVENT (OS_EVENT_T_PERUSER + 0)
#define BLE_HS_EVENT_TX_NOTIFICATIONS (OS_EVENT_T_PERUSER + 1)
#define BLE_HS_EVENT_RESET (OS_EVENT_T_PERUSER + 2)
+#define BLE_HS_EVENT_START (OS_EVENT_T_PERUSER + 3)
#define BLE_HS_SYNC_STATE_BAD 0
#define BLE_HS_SYNC_STATE_BRINGUP 1
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/17eded92/net/nimble/host/test/src/ble_hs_test_util.c
----------------------------------------------------------------------
diff --git a/net/nimble/host/test/src/ble_hs_test_util.c b/net/nimble/host/test/src/ble_hs_test_util.c
index 9cb58e5..9afd660 100644
--- a/net/nimble/host/test/src/ble_hs_test_util.c
+++ b/net/nimble/host/test/src/ble_hs_test_util.c
@@ -1551,8 +1551,6 @@ ble_hs_test_util_hci_txed(uint8_t *cmdbuf, void *arg)
void
ble_hs_test_util_init_no_start(void)
{
- ble_hs_cfg.parent_evq = &ble_hs_test_util_evq;
-
tu_init();
os_eventq_init(&ble_hs_test_util_evq);
@@ -1571,6 +1569,8 @@ ble_hs_test_util_init_no_start(void)
ble_hs_max_attrs = 64;
ble_hs_test_util_prev_hci_tx_clear();
+
+ ble_hs_evq_set(&ble_hs_test_util_evq);
}
void
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/17eded92/net/nimble/host/test/src/ble_os_test.c
----------------------------------------------------------------------
diff --git a/net/nimble/host/test/src/ble_os_test.c b/net/nimble/host/test/src/ble_os_test.c
index 7afd02c..067f0ac 100644
--- a/net/nimble/host/test/src/ble_os_test.c
+++ b/net/nimble/host/test/src/ble_os_test.c
@@ -349,25 +349,8 @@ ble_gap_terminate_test_task_handler(void *arg)
static void
ble_os_test_app_task_handler(void *arg)
{
- struct os_callout_func *cf;
- struct os_event *ev;
- int rc;
-
- rc = ble_hs_start();
- TEST_ASSERT(rc == 0);
-
while (1) {
- ev = os_eventq_get(&ble_hs_test_util_evq);
- switch (ev->ev_type) {
- case OS_EVENT_T_TIMER:
- cf = (struct os_callout_func *)ev;
- assert(cf->cf_func);
- cf->cf_func(CF_ARG(cf));
- break;
- default:
- assert(0);
- break;
- }
+ os_eventq_run(&ble_hs_test_util_evq);
}
}