diff --git a/subsys/sal/sid_pal/src/sid_ble_advert.c b/subsys/sal/sid_pal/src/sid_ble_advert.c index 7aa82dba3a..3a577d835a 100644 --- a/subsys/sal/sid_pal/src/sid_ble_advert.c +++ b/subsys/sal/sid_pal/src/sid_ble_advert.c @@ -8,6 +8,7 @@ #include #include #include +#include #include #include @@ -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. @@ -118,17 +118,35 @@ 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); @@ -136,7 +154,7 @@ static void change_advertisement_interval(struct k_work *work) 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)); @@ -152,8 +170,8 @@ 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)); @@ -161,56 +179,46 @@ int sid_ble_advert_init(void) } } - 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; } @@ -218,8 +226,7 @@ int sid_ble_advert_start(void) 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); @@ -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; diff --git a/tests/unit_tests/pal_ble_adapter/src/main.c b/tests/unit_tests/pal_ble_adapter/src/main.c index 8d4ff101f0..7c288d14ce 100644 --- a/tests/unit_tests/pal_ble_adapter/src/main.c +++ b/tests/unit_tests/pal_ble_adapter/src/main.c @@ -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 *, @@ -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) \ diff --git a/tests/unit_tests/sid_ble_advert/src/main.c b/tests/unit_tests/sid_ble_advert/src/main.c index 73cebe7ef5..5b4be4b7a4 100644 --- a/tests/unit_tests/sid_ble_advert/src/main.c +++ b/tests/unit_tests/sid_ble_advert/src/main.c @@ -8,6 +8,7 @@ #include #include +#include #include #include @@ -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) @@ -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;