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 2015/12/18 21:23:25 UTC

[3/3] incubator-mynewt-larva git commit: Reduce startup code with generic HCI ack fn.

Reduce startup code with generic HCI ack fn.


Project: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/commit/ecb584ed
Tree: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/tree/ecb584ed
Diff: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/diff/ecb584ed

Branch: refs/heads/master
Commit: ecb584ed0a82d06583c0827a253b1ac24c065aa0
Parents: 3171a5c
Author: Christopher Collins <cc...@gmail.com>
Authored: Fri Dec 18 12:22:35 2015 -0800
Committer: Christopher Collins <cc...@gmail.com>
Committed: Fri Dec 18 12:22:35 2015 -0800

----------------------------------------------------------------------
 net/nimble/host/src/ble_hs_startup.c | 176 ++++++++++++------------------
 1 file changed, 71 insertions(+), 105 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/blob/ecb584ed/net/nimble/host/src/ble_hs_startup.c
----------------------------------------------------------------------
diff --git a/net/nimble/host/src/ble_hs_startup.c b/net/nimble/host/src/ble_hs_startup.c
index d0e071d..9f6a20a 100644
--- a/net/nimble/host/src/ble_hs_startup.c
+++ b/net/nimble/host/src/ble_hs_startup.c
@@ -24,16 +24,28 @@
 
 #define BLE_HS_STARTUP_STATE_IDLE                       0
 #define BLE_HS_STARTUP_STATE_RESET                      1
-#define BLE_HS_STARTUP_STATE_RESET_ACKED                2
-#define BLE_HS_STARTUP_STATE_SET_EVENT_MASK             3
-#define BLE_HS_STARTUP_STATE_SET_EVENT_MASK_ACKED       4
-#define BLE_HS_STARTUP_STATE_LE_SET_EVENT_MASK          5
-#define BLE_HS_STARTUP_STATE_LE_SET_EVENT_MASK_ACKED    6
-#define BLE_HS_STARTUP_STATE_LE_READ_BUF_SIZE           7
-#define BLE_HS_STARTUP_STATE_LE_READ_BUF_SIZE_ACKED     8
+#define BLE_HS_STARTUP_STATE_SET_EVMASK                 2
+#define BLE_HS_STARTUP_STATE_LE_SET_EVMASK              3
+#define BLE_HS_STARTUP_STATE_LE_READ_BUF_SZ             4
+#define BLE_HS_STARTUP_STATE_MAX                        5
 
 static uint8_t ble_hs_startup_state;
 
+static int ble_hs_startup_reset_tx(void *arg);
+static int ble_hs_startup_set_evmask_tx(void *arg);
+static int ble_hs_startup_le_set_evmask_tx(void *arg);
+static int ble_hs_startup_le_read_buf_sz_tx(void *arg);
+
+static ble_hci_sched_tx_fn * const
+    ble_hs_startup_dispatch[BLE_HS_STARTUP_STATE_MAX] = {
+
+    [BLE_HS_STARTUP_STATE_IDLE]             = NULL,
+    [BLE_HS_STARTUP_STATE_RESET]            = ble_hs_startup_reset_tx,
+    [BLE_HS_STARTUP_STATE_SET_EVMASK]       = ble_hs_startup_set_evmask_tx,
+    [BLE_HS_STARTUP_STATE_LE_SET_EVMASK]    = ble_hs_startup_le_set_evmask_tx,
+    [BLE_HS_STARTUP_STATE_LE_READ_BUF_SZ]   = ble_hs_startup_le_read_buf_sz_tx,
+};
+
 static void
 ble_hs_startup_failure(int status)
 {
@@ -41,6 +53,42 @@ ble_hs_startup_failure(int status)
     /* XXX: Signal failure. */
 }
 
+static int
+ble_hs_startup_enqueue_tx(void)
+{
+    ble_hci_sched_tx_fn *tx_fn;
+    int rc;
+
+    if (ble_hs_startup_state == BLE_HS_STARTUP_STATE_MAX) {
+        return 0;
+    }
+
+    tx_fn = ble_hs_startup_dispatch[ble_hs_startup_state];
+    assert(tx_fn != NULL);
+
+    rc = ble_hci_sched_enqueue(tx_fn, NULL);
+    if (rc != 0) {
+        ble_hs_startup_failure(rc);
+        return rc;
+    }
+
+    return 0;
+}
+
+static void
+ble_hs_startup_gen_ack(struct ble_hci_ack *ack, void *arg)
+{
+    assert(ble_hs_startup_state < BLE_HS_STARTUP_STATE_MAX);
+
+    if (ack->bha_status != 0) {
+        ble_hs_startup_failure(ack->bha_status);
+        return;
+    }
+
+    ble_hs_startup_state++;
+    ble_hs_startup_enqueue_tx();
+}
+
 static void
 ble_hs_startup_read_buf_size_ack(struct ble_hci_ack *ack, void *arg)
 {
@@ -48,8 +96,7 @@ ble_hs_startup_read_buf_size_ack(struct ble_hci_ack *ack, void *arg)
     uint8_t max_pkts;
     int rc;
 
-    assert(ble_hs_startup_state ==
-           BLE_HS_STARTUP_STATE_LE_READ_BUF_SIZE_ACKED - 1);
+    assert(ble_hs_startup_state == BLE_HS_STARTUP_STATE_LE_READ_BUF_SZ);
 
     if (ack->bha_status != 0) {
         ble_hs_startup_failure(ack->bha_status);
@@ -70,21 +117,18 @@ ble_hs_startup_read_buf_size_ack(struct ble_hci_ack *ack, void *arg)
         return;
     }
 
-    ble_hs_startup_state = BLE_HS_STARTUP_STATE_LE_READ_BUF_SIZE_ACKED;
-
-    /* XXX: Send read buffer size. */
+    ble_hs_startup_state++;
+    ble_hs_startup_enqueue_tx();
 }
 
 static int
-ble_hs_startup_le_read_buf_size_tx(void *arg)
+ble_hs_startup_le_read_buf_sz_tx(void *arg)
 {
     int rc;
 
-    assert(ble_hs_startup_state == BLE_HS_STARTUP_STATE_LE_READ_BUF_SIZE - 1);
+    assert(ble_hs_startup_state == BLE_HS_STARTUP_STATE_LE_READ_BUF_SZ);
 
-    ble_hs_startup_state = BLE_HS_STARTUP_STATE_LE_READ_BUF_SIZE;
     ble_hci_ack_set_callback(ble_hs_startup_read_buf_size_ack, NULL);
-
     rc = host_hci_cmd_le_read_buffer_size();
     if (rc != 0) {
         return rc;
@@ -93,39 +137,14 @@ ble_hs_startup_le_read_buf_size_tx(void *arg)
     return 0;
 }
 
-static void
-ble_hs_startup_le_set_event_mask_ack(struct ble_hci_ack *ack, void *arg)
-{
-    int rc;
-
-    assert(ble_hs_startup_state ==
-           BLE_HS_STARTUP_STATE_LE_SET_EVENT_MASK_ACKED - 1);
-
-    if (ack->bha_status != 0) {
-        ble_hs_startup_failure(ack->bha_status);
-        return;
-    }
-
-    ble_hs_startup_state = BLE_HS_STARTUP_STATE_LE_SET_EVENT_MASK_ACKED;
-
-    /* XXX: Send LE Set event mask. */
-    rc = ble_hci_sched_enqueue(ble_hs_startup_le_read_buf_size_tx, NULL);
-    if (rc != 0) {
-        ble_hs_startup_failure(rc);
-        return;
-    }
-}
-
 static int
-ble_hs_startup_le_set_event_mask_tx(void *arg)
+ble_hs_startup_le_set_evmask_tx(void *arg)
 {
     int rc;
 
-    assert(ble_hs_startup_state == BLE_HS_STARTUP_STATE_LE_SET_EVENT_MASK - 1);
-
-    ble_hs_startup_state = BLE_HS_STARTUP_STATE_LE_SET_EVENT_MASK;
-    ble_hci_ack_set_callback(ble_hs_startup_le_set_event_mask_ack, NULL);
+    assert(ble_hs_startup_state == BLE_HS_STARTUP_STATE_LE_SET_EVMASK);
 
+    ble_hci_ack_set_callback(ble_hs_startup_gen_ack, NULL);
     rc = host_hci_cmd_le_set_event_mask(0x000000000000001f);
     if (rc != 0) {
         return rc;
@@ -134,38 +153,14 @@ ble_hs_startup_le_set_event_mask_tx(void *arg)
     return 0;
 }
 
-static void
-ble_hs_startup_set_event_mask_ack(struct ble_hci_ack *ack, void *arg)
-{
-    int rc;
-
-    assert(ble_hs_startup_state ==
-           BLE_HS_STARTUP_STATE_SET_EVENT_MASK_ACKED - 1);
-
-    if (ack->bha_status != 0) {
-        ble_hs_startup_failure(ack->bha_status);
-        return;
-    }
-
-    ble_hs_startup_state = BLE_HS_STARTUP_STATE_SET_EVENT_MASK_ACKED;
-
-    rc = ble_hci_sched_enqueue(ble_hs_startup_le_set_event_mask_tx, NULL);
-    if (rc != 0) {
-        ble_hs_startup_failure(rc);
-        return;
-    }
-}
-
 static int
-ble_hs_startup_set_event_mask_tx(void *arg)
+ble_hs_startup_set_evmask_tx(void *arg)
 {
     int rc;
 
-    assert(ble_hs_startup_state == BLE_HS_STARTUP_STATE_SET_EVENT_MASK - 1);
-
-    ble_hs_startup_state = BLE_HS_STARTUP_STATE_SET_EVENT_MASK;
-    ble_hci_ack_set_callback(ble_hs_startup_set_event_mask_ack, NULL);
+    assert(ble_hs_startup_state == BLE_HS_STARTUP_STATE_SET_EVMASK);
 
+    ble_hci_ack_set_callback(ble_hs_startup_gen_ack, NULL);
     rc = host_hci_cmd_set_event_mask(0x20001fffffffffff);
     if (rc != 0) {
         return rc;
@@ -174,38 +169,14 @@ ble_hs_startup_set_event_mask_tx(void *arg)
     return 0;
 }
 
-static void
-ble_hs_startup_reset_ack(struct ble_hci_ack *ack, void *arg)
-{
-    int rc;
-
-    assert(ble_hs_startup_state == BLE_HS_STARTUP_STATE_RESET_ACKED - 1);
-
-    if (ack->bha_status != 0) {
-        ble_hs_startup_failure(ack->bha_status);
-        return;
-    }
-
-    ble_hs_startup_state = BLE_HS_STARTUP_STATE_RESET_ACKED;
-
-    rc = ble_hci_sched_enqueue(ble_hs_startup_set_event_mask_tx, NULL);
-    if (rc != 0) {
-        ble_hs_startup_failure(rc);
-        return;
-    }
-}
-
-
 static int
 ble_hs_startup_reset_tx(void *arg)
 {
     int rc;
 
-    assert(ble_hs_startup_state == BLE_HS_STARTUP_STATE_RESET - 1);
-
-    ble_hs_startup_state = BLE_HS_STARTUP_STATE_RESET;
-    ble_hci_ack_set_callback(ble_hs_startup_reset_ack, NULL);
+    assert(ble_hs_startup_state == BLE_HS_STARTUP_STATE_RESET);
 
+    ble_hci_ack_set_callback(ble_hs_startup_gen_ack, NULL);
     rc = host_hci_cmd_reset();
     if (rc != 0) {
         return rc;
@@ -219,13 +190,8 @@ ble_hs_startup_go(void)
 {
     int rc;
 
-    ble_hs_startup_state = BLE_HS_STARTUP_STATE_IDLE;
-
-    rc = ble_hci_sched_enqueue(ble_hs_startup_reset_tx, NULL);
-    if (rc != 0) {
-        ble_hs_startup_failure(rc);
-        return rc;
-    }
+    ble_hs_startup_state = BLE_HS_STARTUP_STATE_RESET;
 
-    return 0;
+    rc = ble_hs_startup_enqueue_tx();
+    return rc;
 }