Skip to content

Commit

Permalink
ble: stop adv when connected
Browse files Browse the repository at this point in the history
prevent calling change_adv_work when already connected

Signed-off-by: Robert Gałat <[email protected]>
  • Loading branch information
RobertGalatNordic committed Nov 21, 2024
1 parent 0438cd7 commit 4a3bd20
Show file tree
Hide file tree
Showing 3 changed files with 60 additions and 40 deletions.
79 changes: 43 additions & 36 deletions subsys/sal/sid_pal/src/sid_ble_advert.c
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
#include <zephyr/sys/util.h>
#include <sid_ble_advert.h>
#include <sid_ble_uuid.h>
#include <sid_ble_connection.h>

#include <sid_ble_uuid.h>
#include <bt_app_callbacks.h>
Expand Down Expand Up @@ -52,8 +53,7 @@ static struct bt_le_adv_param adv_param_slow = {
CONFIG_SIDEWALK_BLE_ADV_INT_PRECISION),
};

static struct bt_le_ext_adv *adv_set_fast = NULL;
static struct bt_le_ext_adv *adv_set_slow = NULL;
static struct bt_le_ext_adv *adv_set = NULL;

/**
* @brief Advertising data items values size in bytes.
Expand Down Expand Up @@ -118,25 +118,43 @@ static void change_advertisement_interval(struct k_work *work)
{
ARG_UNUSED(work);

const sid_ble_conn_params_t *sidewalk_conn = sid_ble_conn_params_get();
if (sidewalk_conn == NULL || sidewalk_conn->conn == NULL) {
return;
}

struct bt_le_ext_adv_start_param ext_adv_start_param = { 0 };

if (BLE_ADV_FAST == atomic_get(&adv_state)) {
int err = 0;
err = bt_le_ext_adv_stop(adv_set_fast);
err = bt_le_ext_adv_stop(adv_set);
if (err) {
atomic_set(&adv_state, BLE_ADV_DISABLE);
LOG_ERR("Failed to stop fast adv errno %d (%s)", err, strerror(err));
return;
}
err = bt_le_ext_adv_set_data(adv_set_slow, adv_data, ARRAY_SIZE(adv_data), sd,
err = bt_le_ext_adv_delete(adv_set);
if (err) {
atomic_set(&adv_state, BLE_ADV_DISABLE);
LOG_ERR("Failed to delete adv set");
return;
}
adv_set = NULL;
err = bt_le_ext_adv_create(&adv_param_slow, NULL, &adv_set);
if (err) {
atomic_set(&adv_state, BLE_ADV_DISABLE);
LOG_ERR("Failed to create slow adv set");
return;
}
err = bt_le_ext_adv_set_data(adv_set, adv_data, ARRAY_SIZE(adv_data), sd,
ARRAY_SIZE(sd));
if (err) {
atomic_set(&adv_state, BLE_ADV_DISABLE);
LOG_ERR("Failed to set adv data to slow adv errno %d (%s)", err,
strerror(err));
return;
}
err = bt_le_ext_adv_start(adv_set_slow, &ext_adv_start_param);
err = bt_le_ext_adv_start(adv_set, &ext_adv_start_param);
if (err) {
atomic_set(&adv_state, BLE_ADV_DISABLE);
LOG_ERR("Failed to start slow adv errno %d (%s)", err, strerror(err));
Expand All @@ -152,74 +170,63 @@ static void change_advertisement_interval(struct k_work *work)
int sid_ble_advert_init(void)
{
int ret;
if (adv_set_fast == NULL) {
ret = bt_le_ext_adv_create(&adv_param_fast, NULL, &adv_set_fast);
if (adv_set == NULL) {
ret = bt_le_ext_adv_create(&adv_param_fast, NULL, &adv_set);
if (ret) {
LOG_ERR("Failed to create fast advertising set errno %d (%s)", ret,
strerror(ret));
return ret;
}
}

if (adv_set_slow == NULL) {
ret = bt_le_ext_adv_create(&adv_param_slow, NULL, &adv_set_slow);
if (ret) {
LOG_ERR("Failed to create slow advertising set errno %d (%s)", ret,
strerror(ret));
return ret;
}
}

return 0;
}

int sid_ble_advert_deinit(void)
{
int err = bt_le_ext_adv_delete(adv_set_fast);
if (err) {
LOG_ERR("Failed to delete adv_set_fast errno %d (%s)", err, strerror(err));
return err;
}
adv_set_fast = NULL;
err = bt_le_ext_adv_delete(adv_set_slow);
if (err) {
LOG_ERR("Failed to delete adv_set_slow errno %d (%s)", err, strerror(err));
return err;
if (adv_set != NULL) {
int err = bt_le_ext_adv_delete(adv_set);
if (err) {
LOG_ERR("Failed to delete adv_set_fast errno %d (%s)", err, strerror(err));
return err;
}
adv_set = NULL;
}
adv_set_slow = NULL;

return 0;
}

int sid_ble_advert_start(void)
{
k_work_reschedule(&change_adv_work, K_SECONDS(CONFIG_SIDEWALK_BLE_ADV_INT_TRANSITION));

struct bt_le_ext_adv_start_param ext_adv_start_param = { 0 };
int err = 0;
sid_ble_advert_deinit();
sid_ble_advert_init();

err = bt_le_ext_adv_set_data(adv_set_fast, adv_data, ARRAY_SIZE(adv_data), sd,
ARRAY_SIZE(sd));
err = bt_le_ext_adv_set_data(adv_set, adv_data, ARRAY_SIZE(adv_data), sd, ARRAY_SIZE(sd));
if (err) {
atomic_set(&adv_state, BLE_ADV_DISABLE);
LOG_ERR("Failed to set fast adv data errno: %d (%s)", err, strerror(err));
return err;
}

err = bt_le_ext_adv_start(adv_set_fast, &ext_adv_start_param);
err = bt_le_ext_adv_start(adv_set, &ext_adv_start_param);
if (err) {
atomic_set(&adv_state, BLE_ADV_DISABLE);
LOG_ERR("Failed to start fast adv errno: %d (%s)", err, strerror(err));
return err;
}

atomic_set(&adv_state, BLE_ADV_FAST);
k_work_reschedule(&change_adv_work, K_SECONDS(CONFIG_SIDEWALK_BLE_ADV_INT_TRANSITION));

return err;
}

int sid_ble_advert_stop(void)
{
k_work_cancel_delayable(&change_adv_work);
int err = bt_le_ext_adv_stop(atomic_get(&adv_state) == BLE_ADV_FAST ? adv_set_fast :
adv_set_slow);
int err = bt_le_ext_adv_stop(adv_set);

if (0 == err) {
atomic_set(&adv_state, BLE_ADV_DISABLE);
Expand All @@ -242,8 +249,8 @@ int sid_ble_advert_update(uint8_t *data, uint8_t data_len)

if (BLE_ADV_DISABLE != state) {
/* Update currently advertised set, the other one will be set on start/transition */
err = bt_le_ext_adv_set_data((state == BLE_ADV_FAST ? adv_set_fast : adv_set_slow),
adv_data, ARRAY_SIZE(adv_data), sd, ARRAY_SIZE(sd));
err = bt_le_ext_adv_set_data(adv_set, adv_data, ARRAY_SIZE(adv_data), sd,
ARRAY_SIZE(sd));
}

return err;
Expand Down
5 changes: 5 additions & 0 deletions tests/unit_tests/pal_ble_adapter/src/main.c
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,9 @@ FAKE_VALUE_FUNC(int, bt_le_ext_adv_set_data, struct bt_le_ext_adv *, const struc
const struct bt_data *, size_t);
FAKE_VALUE_FUNC(int, bt_le_ext_adv_start, struct bt_le_ext_adv *,
const struct bt_le_ext_adv_start_param *);
FAKE_VALUE_FUNC(int, bt_le_ext_adv_delete, struct bt_le_ext_adv *);
FAKE_VALUE_FUNC(int, bt_le_ext_adv_create, const struct bt_le_adv_param *,
const struct bt_le_ext_adv_cb *, struct bt_le_ext_adv **);
FAKE_VALUE_FUNC(int, bt_enable, bt_ready_cb_t);
FAKE_VALUE_FUNC(int, bt_disable);
FAKE_VALUE_FUNC(int, bt_le_adv_start, const struct bt_le_adv_param *, const struct bt_data *,
Expand Down Expand Up @@ -63,6 +66,8 @@ FAKE_VALUE_FUNC(int, bt_conn_get_info, const struct bt_conn *, struct bt_conn_in
FAKE(bt_enable) \
FAKE(bt_disable) \
FAKE(bt_le_adv_start) \
FAKE(bt_le_ext_adv_delete) \
FAKE(bt_le_ext_adv_create) \
FAKE(bt_le_adv_stop) \
FAKE(bt_conn_cb_register) \
FAKE(bt_conn_ref) \
Expand Down
16 changes: 12 additions & 4 deletions tests/unit_tests/sid_ble_advert/src/main.c
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@

#include <sid_ble_advert.h>
#include <sid_ble_uuid.h>
#include <sid_ble_connection.h>

#include <zephyr/bluetooth/bluetooth.h>
#include <zephyr/bluetooth/conn.h>
Expand All @@ -20,11 +21,18 @@ FAKE_VALUE_FUNC(int, bt_le_ext_adv_start, struct bt_le_ext_adv *,
FAKE_VALUE_FUNC(int, bt_le_ext_adv_stop, struct bt_le_ext_adv *);
FAKE_VALUE_FUNC(int, bt_le_ext_adv_set_data, struct bt_le_ext_adv *, const struct bt_data *, size_t,
const struct bt_data *, size_t);
FAKE_VALUE_FUNC(int, bt_le_ext_adv_delete, struct bt_le_ext_adv *);
FAKE_VALUE_FUNC(int, bt_le_ext_adv_create, const struct bt_le_adv_param *,
const struct bt_le_ext_adv_cb *, struct bt_le_ext_adv **);
FAKE_VALUE_FUNC(const sid_ble_conn_params_t *, sid_ble_conn_params_get);

#define FFF_FAKES_LIST(FAKE) \
FAKE(bt_le_ext_adv_start) \
FAKE(bt_le_ext_adv_stop) \
FAKE(bt_le_ext_adv_set_data)
FAKE(bt_le_ext_adv_start) \
FAKE(bt_le_ext_adv_stop) \
FAKE(bt_le_ext_adv_set_data) \
FAKE(bt_le_ext_adv_delete) \
FAKE(bt_le_ext_adv_create) \
FAKE(sid_ble_conn_params_get)

#define ESUCCESS (0)
#define TEST_BUFFER_LEN (100)
Expand Down Expand Up @@ -111,7 +119,7 @@ bool advert_data_manuf_data_get(const struct bt_data *ad, size_t ad_len, uint8_t
for (size_t i = 0; i < ad_len; i++) {
if (ad[i].type == BT_DATA_MANUFACTURER_DATA) {
TEST_ASSERT_GREATER_OR_EQUAL_UINT8(BT_COMP_ID_LEN, ad[i].data_len);
TEST_ASSERT_EQUAL_UINT8(((BT_COMP_ID_AMA) & 0xff), ad[i].data[0]);
TEST_ASSERT_EQUAL_UINT8(((BT_COMP_ID_AMA)&0xff), ad[i].data[0]);
TEST_ASSERT_EQUAL_UINT8((((BT_COMP_ID_AMA) >> 8) & 0xff), ad[i].data[1]);

*result_len = ad[i].data_len - BT_COMP_ID_LEN;
Expand Down

0 comments on commit 4a3bd20

Please sign in to comment.