samples: Bluetooth: Handle shutdown of iso broadcast benchmark
The sample did not properly handle ending the broadcast and setting it up for a new broadcast, due to missing wait for sem_big_term and a bad check in iso_disconnected. Furthermore if any did not work when setting up the BIG, the error handling did not properly clean up for a retry. Signed-off-by: Emil Gydesen <emil.gydesen@nordicsemi.no>
This commit is contained in:
parent
f25a8aaf1a
commit
4d60f0a51b
1 changed files with 42 additions and 24 deletions
|
|
@ -12,6 +12,7 @@
|
||||||
#include <zephyr/console/console.h>
|
#include <zephyr/console/console.h>
|
||||||
#include <zephyr/bluetooth/bluetooth.h>
|
#include <zephyr/bluetooth/bluetooth.h>
|
||||||
#include <zephyr/bluetooth/iso.h>
|
#include <zephyr/bluetooth/iso.h>
|
||||||
|
#include <zephyr/kernel.h>
|
||||||
#include <zephyr/sys/byteorder.h>
|
#include <zephyr/sys/byteorder.h>
|
||||||
|
|
||||||
#include <zephyr/logging/log.h>
|
#include <zephyr/logging/log.h>
|
||||||
|
|
@ -86,7 +87,7 @@ static void iso_disconnected(struct bt_iso_chan *chan, uint8_t reason)
|
||||||
chan, reason);
|
chan, reason);
|
||||||
|
|
||||||
connected_bis--;
|
connected_bis--;
|
||||||
if (connected_bis == big_create_param.num_bis) {
|
if (connected_bis == 0) {
|
||||||
k_sem_give(&sem_big_term);
|
k_sem_give(&sem_big_term);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -681,7 +682,7 @@ static int create_big(struct bt_le_ext_adv **adv, struct bt_iso_big **big)
|
||||||
err = bt_le_ext_adv_set_data(*adv, ad, ARRAY_SIZE(ad), NULL, 0);
|
err = bt_le_ext_adv_set_data(*adv, ad, ARRAY_SIZE(ad), NULL, 0);
|
||||||
if (err) {
|
if (err) {
|
||||||
LOG_ERR("Failed to set advertising data (err %d)", err);
|
LOG_ERR("Failed to set advertising data (err %d)", err);
|
||||||
return 0;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
LOG_INF("Setting Periodic Advertising parameters");
|
LOG_INF("Setting Periodic Advertising parameters");
|
||||||
|
|
@ -739,32 +740,41 @@ static int delete_big(struct bt_le_ext_adv **adv, struct bt_iso_big **big)
|
||||||
{
|
{
|
||||||
int err;
|
int err;
|
||||||
|
|
||||||
err = bt_iso_big_terminate(*big);
|
if (*big != NULL) {
|
||||||
if (err != 0) {
|
err = bt_iso_big_terminate(*big);
|
||||||
LOG_ERR("Failed to terminate BIG (err %d)", err);
|
if (err != 0) {
|
||||||
return err;
|
LOG_ERR("Failed to terminate BIG (err %d)", err);
|
||||||
}
|
return err;
|
||||||
*big = NULL;
|
}
|
||||||
|
err = k_sem_take(&sem_big_term, K_FOREVER);
|
||||||
err = bt_le_per_adv_stop(*adv);
|
if (err != 0) {
|
||||||
if (err != 0) {
|
LOG_ERR("failed to take sem_big_term (err %d)", err);
|
||||||
LOG_ERR("Failed to stop periodic advertising (err %d)", err);
|
return err;
|
||||||
return err;
|
}
|
||||||
|
*big = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
err = bt_le_ext_adv_stop(*adv);
|
if (*adv != NULL) {
|
||||||
if (err != 0) {
|
err = bt_le_per_adv_stop(*adv);
|
||||||
LOG_ERR("Failed to stop advertising (err %d)", err);
|
if (err != 0) {
|
||||||
return err;
|
LOG_ERR("Failed to stop periodic advertising (err %d)", err);
|
||||||
}
|
return err;
|
||||||
|
}
|
||||||
|
|
||||||
err = bt_le_ext_adv_delete(*adv);
|
err = bt_le_ext_adv_stop(*adv);
|
||||||
if (err != 0) {
|
if (err != 0) {
|
||||||
LOG_ERR("Failed to delete advertiser (err %d)", err);
|
LOG_ERR("Failed to stop advertising (err %d)", err);
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
*adv = NULL;
|
err = bt_le_ext_adv_delete(*adv);
|
||||||
|
if (err != 0) {
|
||||||
|
LOG_ERR("Failed to delete advertiser (err %d)", err);
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
|
||||||
|
*adv = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
@ -810,7 +820,15 @@ int test_run_broadcaster(void)
|
||||||
|
|
||||||
err = create_big(&adv, &big);
|
err = create_big(&adv, &big);
|
||||||
if (err) {
|
if (err) {
|
||||||
|
int del_err;
|
||||||
|
|
||||||
LOG_ERR("Could not create BIG: %d", err);
|
LOG_ERR("Could not create BIG: %d", err);
|
||||||
|
|
||||||
|
del_err = delete_big(&adv, &big);
|
||||||
|
if (del_err) {
|
||||||
|
LOG_ERR("Could not delete BIG: %d", del_err);
|
||||||
|
}
|
||||||
|
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue