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(>bs_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