Bluetooth: host: periodic adv shell support

Added shell support for periodic advertisement params,
data and enable.

Signed-off-by: Emil Gydesen <emil_gydesen@bose.com>
This commit is contained in:
Emil Gydesen 2020-05-01 16:50:54 +02:00 committed by Carles Cufí
commit d5801316d7

View file

@ -1245,6 +1245,122 @@ static int cmd_adv_info(const struct shell *shell, size_t argc, char *argv[])
return 0;
}
#if defined(CONFIG_BT_PER_ADV)
static int cmd_per_adv(const struct shell *shell, size_t argc, char *argv[])
{
struct bt_le_ext_adv *adv = adv_sets[selected_adv];
if (!adv) {
shell_error(shell, "No extended advertisement set selected");
return -EINVAL;
}
if (!strcmp(argv[1], "off")) {
if (bt_le_per_adv_stop(adv) < 0) {
shell_error(shell,
"Failed to stop periodic advertising");
} else {
shell_print(shell, "Periodic advertising stopped");
}
} else if (!strcmp(argv[1], "on")) {
if (bt_le_per_adv_start(adv) < 0) {
shell_error(shell,
"Failed to start periodic advertising");
} else {
shell_print(shell, "Periodic advertising started");
}
} else {
shell_error(shell, "Invalid argument: %s", argv[1]);
return -EINVAL;
}
return 0;
}
static int cmd_per_adv_param(const struct shell *shell, size_t argc,
char *argv[])
{
struct bt_le_ext_adv *adv = adv_sets[selected_adv];
struct bt_le_per_adv_param param;
int err;
if (!adv) {
shell_error(shell, "No extended advertisement set selected");
return -EINVAL;
}
if (argc > 1) {
param.interval_min = strtol(argv[1], NULL, 16);
} else {
param.interval_min = BT_GAP_ADV_SLOW_INT_MIN;
}
if (argc > 2) {
param.interval_max = strtol(argv[2], NULL, 16);
} else {
param.interval_max = param.interval_min * 1.2;
}
if (param.interval_min > param.interval_max) {
shell_error(shell,
"Min interval shall be less than max interval");
return -EINVAL;
}
if (argc > 3 && !strcmp(argv[3], "tx-power")) {
param.options = BT_LE_ADV_OPT_USE_TX_POWER;
} else {
param.options = 0;
}
err = bt_le_per_adv_set_param(adv, &param);
if (err) {
shell_error(shell, "Failed to set periodic advertisement "
"parameters (%d)", err);
return -ENOEXEC;
}
return 0;
}
static int cmd_per_adv_data(const struct shell *shell, size_t argc,
char *argv[])
{
struct bt_le_ext_adv *adv = adv_sets[selected_adv];
static struct bt_data ad;
static uint8_t hex_data[256];
uint8_t ad_len = 0;
int err;
if (!adv) {
shell_error(shell, "No extended advertisement set selected");
return -EINVAL;
}
ad_len = hex2bin(argv[1], strlen(argv[1]), hex_data, sizeof(hex_data));
if (!ad_len) {
shell_error(shell, "Could not parse adv data");
return -ENOEXEC;
}
ad.data_len = hex_data[0];
ad.type = hex_data[1];
ad.data = &hex_data[2];
err = bt_le_per_adv_set_data(adv, &ad, ad_len);
if (err) {
shell_error(shell,
"Failed to set periodic advertising data (%d)",
err);
return -ENOEXEC;
}
return 0;
}
#endif /* CONFIG_BT_PER_ADV */
#endif /* CONFIG_BT_EXT_ADV */
#endif /* CONFIG_BT_BROADCASTER */
@ -2478,6 +2594,13 @@ SHELL_STATIC_SUBCMD_SET_CREATE(bt_cmds,
SHELL_CMD_ARG(adv-select, NULL, "[adv]", cmd_adv_select, 1, 1),
SHELL_CMD_ARG(adv-oob, NULL, HELP_NONE, cmd_adv_oob, 1, 0),
SHELL_CMD_ARG(adv-info, NULL, HELP_NONE, cmd_adv_info, 1, 0),
#if defined(CONFIG_BT_PER_ADV)
SHELL_CMD_ARG(per-adv, NULL, "<type: off, on>", cmd_per_adv, 2, 0),
SHELL_CMD_ARG(per-adv-param, NULL,
"[<interval-min> [<interval-max> [tx_power]]]",
cmd_per_adv_param, 1, 3),
SHELL_CMD_ARG(per-adv-data, NULL, "<data>", cmd_per_adv_data, 2, 0),
#endif
#endif
#endif /* CONFIG_BT_BROADCASTER */
#if defined(CONFIG_BT_CONN)