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