1 /** @file
2 * @brief Bluetooth Call Control Profile Call Control Client shell
3 */
4
5 /*
6 * Copyright (c) 2024 Nordic Semiconductor ASA
7 *
8 * SPDX-License-Identifier: Apache-2.0
9 */
10 #include <errno.h>
11 #include <stdint.h>
12 #include <stdio.h>
13
14 #include <zephyr/autoconf.h>
15 #include <zephyr/bluetooth/audio/tbs.h>
16 #include <zephyr/bluetooth/audio/ccp.h>
17 #include <zephyr/bluetooth/conn.h>
18 #include <zephyr/shell/shell.h>
19
20 #include "common/bt_shell_private.h"
21 #include "host/shell/bt.h"
22
23 static struct bt_ccp_call_control_client *clients[CONFIG_BT_MAX_CONN];
24
ccp_call_control_client_discover_cb(struct bt_ccp_call_control_client * client,int err,struct bt_ccp_call_control_client_bearers * bearers)25 static void ccp_call_control_client_discover_cb(struct bt_ccp_call_control_client *client, int err,
26 struct bt_ccp_call_control_client_bearers *bearers)
27 {
28 struct bt_ccp_call_control_client_bearer *gtbs_bearer = NULL;
29 uint8_t tbs_count = 0U;
30
31 if (err != 0) {
32 bt_shell_error("Failed to discover TBS: %d", err);
33 return;
34 }
35 #if defined(CONFIG_BT_TBS_CLIENT_GTBS)
36 gtbs_bearer = bearers->gtbs_bearer;
37 #endif /* CONFIG_BT_TBS_CLIENT_GTBS */
38 #if defined(CONFIG_BT_TBS_CLIENT_TBS)
39 tbs_count = bearers->tbs_count;
40 #endif /* CONFIG_BT_TBS_CLIENT_TBS */
41
42 bt_shell_info("Discovery completed with %s%u TBS bearers",
43 gtbs_bearer != NULL ? "GTBS and " : "", tbs_count);
44 }
45
cmd_ccp_call_control_client_discover(const struct shell * sh,size_t argc,char * argv[])46 static int cmd_ccp_call_control_client_discover(const struct shell *sh, size_t argc, char *argv[])
47 {
48 static bool cb_registered;
49
50 int err;
51
52 if (default_conn == NULL) {
53 shell_error(sh, "Not connected");
54 return -ENOEXEC;
55 }
56
57 if (!cb_registered) {
58 static struct bt_ccp_call_control_client_cb ccp_call_control_client_cbs = {
59 .discover = ccp_call_control_client_discover_cb,
60 };
61
62 err = bt_ccp_call_control_client_register_cb(&ccp_call_control_client_cbs);
63 if (err != 0) {
64 shell_error(sh, "Failed to register CCP Call Control Client cbs (err %d)",
65 err);
66 return -ENOEXEC;
67 }
68 }
69
70 err = bt_ccp_call_control_client_discover(default_conn,
71 &clients[bt_conn_index(default_conn)]);
72 if (err != 0) {
73 shell_error(sh, "Failed to discover GTBS: %d", err);
74
75 return -ENOEXEC;
76 }
77
78 return 0;
79 }
80
cmd_ccp_call_control_client(const struct shell * sh,size_t argc,char ** argv)81 static int cmd_ccp_call_control_client(const struct shell *sh, size_t argc, char **argv)
82 {
83 if (argc > 1) {
84 shell_error(sh, "%s unknown parameter: %s", argv[0], argv[1]);
85 } else {
86 shell_error(sh, "%s Missing subcommand", argv[0]);
87 }
88
89 return -ENOEXEC;
90 }
91
92 SHELL_STATIC_SUBCMD_SET_CREATE(ccp_call_control_client_cmds,
93 SHELL_CMD_ARG(discover, NULL,
94 "Discover GTBS and TBS on remote device",
95 cmd_ccp_call_control_client_discover, 1, 0),
96 SHELL_SUBCMD_SET_END);
97
98 SHELL_CMD_ARG_REGISTER(ccp_call_control_client, &ccp_call_control_client_cmds,
99 "Bluetooth CCP Call Control Client shell commands",
100 cmd_ccp_call_control_client, 1, 1);
101