From 50446afe6cc13c8736a213b135eebb8a7685a4e7 Mon Sep 17 00:00:00 2001 From: Emil Gydesen Date: Thu, 15 Dec 2022 21:00:02 +0100 Subject: [PATCH] Bluetooth: Audio: Shell: Remove csip_set_coordinator init command Remove the init command for teh CSIP Set Coordinator. The main reason for this is that we want to ensure that we register the conn callbacks early so that `conns` array is properly filled. The other callbacks registered in the init function can easily be moved to where they are needed, and even unregistered to avoid parsing more data than we need. Signed-off-by: Emil Gydesen --- subsys/bluetooth/shell/csip_set_coordinator.c | 70 ++++++++----------- 1 file changed, 31 insertions(+), 39 deletions(-) diff --git a/subsys/bluetooth/shell/csip_set_coordinator.c b/subsys/bluetooth/shell/csip_set_coordinator.c index 654d6740887..539eecdf616 100644 --- a/subsys/bluetooth/shell/csip_set_coordinator.c +++ b/subsys/bluetooth/shell/csip_set_coordinator.c @@ -71,7 +71,7 @@ static void disconnected_cb(struct bt_conn *conn, uint8_t reason) conns[conn_index] = NULL; } -static struct bt_conn_cb conn_callbacks = { +BT_CONN_CB_DEFINE(conn_callbacks) = { .connected = connected_cb, .disconnected = disconnected_cb }; @@ -156,6 +156,22 @@ static bool csip_set_coordinator_oap_cb(const struct bt_csip_set_coordinator_set return true; } +static bool csip_found(struct bt_data *data, void *user_data); +static void csip_set_coordinator_scan_recv(const struct bt_le_scan_recv_info *info, + struct net_buf_simple *ad) +{ + /* We're only interested in connectable events */ + if (info->adv_props & BT_GAP_ADV_PROP_CONNECTABLE) { + if (cur_inst != NULL) { + bt_data_parse(ad, csip_found, (void *)info->addr); + } + } +} + +static struct bt_le_scan_cb csip_set_coordinator_scan_callbacks = { + .recv = csip_set_coordinator_scan_recv +}; + static bool csip_found(struct bt_data *data, void *user_data) { if (bt_csip_set_coordinator_is_set_member(cur_inst->info.set_sirk, data)) { @@ -182,6 +198,8 @@ static bool csip_found(struct bt_data *data, void *user_data) (void)k_work_cancel_delayable(&discover_members_timer); + bt_le_scan_cb_unregister(&csip_set_coordinator_scan_callbacks); + err = bt_le_scan_stop(); if (err != 0) { shell_error(ctx_shell, @@ -197,21 +215,6 @@ static bool csip_found(struct bt_data *data, void *user_data) return true; } -static void csip_set_coordinator_scan_recv(const struct bt_le_scan_recv_info *info, - struct net_buf_simple *ad) -{ - /* We're only interested in connectable events */ - if (info->adv_props & BT_GAP_ADV_PROP_CONNECTABLE) { - if (cur_inst != NULL) { - bt_data_parse(ad, csip_found, (void *)info->addr); - } - } -} - -static struct bt_le_scan_cb csip_set_coordinator_scan_callbacks = { - .recv = csip_set_coordinator_scan_recv -}; - static void discover_members_timer_handler(struct k_work *work) { int err; @@ -219,40 +222,30 @@ static void discover_members_timer_handler(struct k_work *work) shell_error(ctx_shell, "Could not find all members (%u / %u)", members_found, cur_inst->info.set_size); + bt_le_scan_cb_unregister(&csip_set_coordinator_scan_callbacks); + err = bt_le_scan_stop(); if (err != 0) { shell_error(ctx_shell, "Failed to stop scan: %d", err); } } -static int cmd_csip_set_coordinator_init(const struct shell *sh, size_t argc, - char *argv[]) -{ - static bool initialized; - - if (initialized) { - return -EALREADY; - } - - k_work_init_delayable(&discover_members_timer, - discover_members_timer_handler); - bt_le_scan_cb_register(&csip_set_coordinator_scan_callbacks); - bt_csip_set_coordinator_register_cb(&cbs); - bt_conn_cb_register(&conn_callbacks); - - initialized = true; - - return 0; -} - static int cmd_csip_set_coordinator_discover(const struct shell *sh, size_t argc, char *argv[]) { char addr[BT_ADDR_LE_STR_LEN]; + static bool initialized; long member_index = 0; struct bt_conn *conn; int err; + if (!initialized) { + k_work_init_delayable(&discover_members_timer, + discover_members_timer_handler); + bt_csip_set_coordinator_register_cb(&cbs); + initialized = true; + } + if (argc > 1) { member_index = strtol(argv[1], NULL, 0); @@ -317,6 +310,8 @@ static int cmd_csip_set_coordinator_discover_members(const struct shell *sh, return err; } + bt_le_scan_cb_register(&csip_set_coordinator_scan_callbacks); + err = bt_le_scan_start(BT_LE_SCAN_ACTIVE, NULL); if (err != 0) { shell_error(sh, "Could not start scan: %d", err); @@ -489,9 +484,6 @@ static int cmd_csip_set_coordinator(const struct shell *sh, size_t argc, } SHELL_STATIC_SUBCMD_SET_CREATE(csip_set_coordinator_cmds, - SHELL_CMD_ARG(init, NULL, - "Initialize csip_set_coordinator", - cmd_csip_set_coordinator_init, 1, 1), SHELL_CMD_ARG(discover, NULL, "Run discover for CSIS on peer device [member_index]", cmd_csip_set_coordinator_discover, 1, 1),