1 /** @file
2  *  @brief Bluetooth Call Control Profile Call Control Server 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 <stdbool.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/shell/shell.h>
18 
19 static struct bt_ccp_call_control_server_bearer
20 	*bearers[CONFIG_BT_CCP_CALL_CONTROL_SERVER_BEARER_COUNT];
21 
cmd_ccp_call_control_server_init(const struct shell * sh,size_t argc,char * argv[])22 static int cmd_ccp_call_control_server_init(const struct shell *sh, size_t argc, char *argv[])
23 {
24 	static bool registered;
25 
26 	if (registered) {
27 		shell_info(sh, "Already initialized");
28 
29 		return -ENOEXEC;
30 	}
31 
32 	const struct bt_tbs_register_param gtbs_param = {
33 		.provider_name = "Generic TBS",
34 		.uci = "un000",
35 		.uri_schemes_supported = "tel,skype",
36 		.gtbs = true,
37 		.authorization_required = false,
38 		.technology = BT_TBS_TECHNOLOGY_3G,
39 		.supported_features = CONFIG_BT_TBS_SUPPORTED_FEATURES,
40 	};
41 	int err;
42 
43 	err = bt_ccp_call_control_server_register_bearer(&gtbs_param, &bearers[0]);
44 	if (err != 0) {
45 		shell_error(sh, "Failed to register GTBS bearer: %d", err);
46 
47 		return -ENOEXEC;
48 	}
49 
50 	shell_info(sh, "Registered GTBS bearer");
51 
52 	for (int i = 1; i < CONFIG_BT_CCP_CALL_CONTROL_SERVER_BEARER_COUNT; i++) {
53 		char prov_name[22]; /* Enough to store "Telephone Bearer #255" */
54 		const struct bt_tbs_register_param tbs_param = {
55 			.provider_name = prov_name,
56 			.uci = "un000",
57 			.uri_schemes_supported = "tel,skype",
58 			.gtbs = false,
59 			.authorization_required = false,
60 			/* Set different technologies per bearer */
61 			.technology = (i % BT_TBS_TECHNOLOGY_WCDMA) + 1,
62 			.supported_features = CONFIG_BT_TBS_SUPPORTED_FEATURES,
63 		};
64 
65 		snprintf(prov_name, sizeof(prov_name), "Telephone Bearer #%d", i);
66 
67 		err = bt_ccp_call_control_server_register_bearer(&tbs_param, &bearers[i]);
68 		if (err != 0) {
69 			shell_error(sh, "Failed to register bearer[%d]: %d", i, err);
70 
71 			return -ENOEXEC;
72 		}
73 
74 		shell_info(sh, "Registered bearer[%d]", i);
75 	}
76 
77 	registered = true;
78 
79 	return 0;
80 }
81 
cmd_ccp_call_control_server(const struct shell * sh,size_t argc,char ** argv)82 static int cmd_ccp_call_control_server(const struct shell *sh, size_t argc, char **argv)
83 {
84 	if (argc > 1) {
85 		shell_error(sh, "%s unknown parameter: %s", argv[0], argv[1]);
86 	} else {
87 		shell_error(sh, "%s Missing subcommand", argv[0]);
88 	}
89 
90 	return -ENOEXEC;
91 }
92 
93 SHELL_STATIC_SUBCMD_SET_CREATE(ccp_call_control_server_cmds,
94 			       SHELL_CMD_ARG(init, NULL, "Initialize CCP Call Control Server",
95 					     cmd_ccp_call_control_server_init, 1, 0),
96 			       SHELL_SUBCMD_SET_END);
97 
98 SHELL_CMD_ARG_REGISTER(ccp_call_control_server, &ccp_call_control_server_cmds,
99 		       "Bluetooth CCP Call Control Server shell commands",
100 		       cmd_ccp_call_control_server, 1, 1);
101