Skip to content

Commit be981c4

Browse files
José Mendeshubpav
José Mendes
authored andcommitted
subsys: ble_tag: add early scan stop
1 parent 3ac3a53 commit be981c4

File tree

1 file changed

+40
-5
lines changed

1 file changed

+40
-5
lines changed

subsys/ctr_ble_tag/ctr_ble_tag.c

+40-5
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,9 @@ struct ble_tag_data {
5959
static struct ble_tag_data tag_data[CTR_BLE_TAG_COUNT];
6060
K_MUTEX_DEFINE(tag_data_lock);
6161

62+
static uint8_t m_scan_tag_mask, m_scan_tag_flags;
63+
static bool m_scan_early_stop;
64+
6265
static volatile bool m_enrolling = false;
6366
static char m_enroll_addr_str[BT_ADDR_SIZE * 2 + 1];
6467

@@ -212,6 +215,18 @@ static void scan_cb(const bt_addr_le_t *addr, int8_t rssi, uint8_t adv_type,
212215
k_sem_give(&m_has_enrolled_sem);
213216
}
214217

218+
m_scan_tag_flags |= BIT(i);
219+
220+
if (!m_enrolling && m_scan_tag_flags == m_scan_tag_mask) {
221+
ret = bt_le_scan_stop();
222+
if (ret) {
223+
LOG_ERR("Call `bt_le_scan_stop` failed: %d", ret);
224+
k_sem_give(&m_scan_sem);
225+
}
226+
227+
m_scan_early_stop = true;
228+
}
229+
215230
tag_data[i].rssi = rssi;
216231
tag_data[i].valid = true;
217232

@@ -492,6 +507,9 @@ static int cmd_config_add_tag(const struct shell *shell, size_t argc, char **arg
492507
for (size_t i = 0; i < CTR_BLE_TAG_COUNT; i++) {
493508
if (ctr_ble_tag_is_addr_empty(m_config_interim.addr[i])) {
494509
memcpy(m_config_interim.addr[i], addr, BT_ADDR_SIZE);
510+
511+
m_scan_tag_mask |= BIT(i);
512+
495513
return 0;
496514
} else if (memcmp(m_config_interim.addr[i], addr, BT_ADDR_SIZE) == 0) {
497515
shell_error(shell, "tag addr %s: already exists", argv[1]);
@@ -535,6 +553,9 @@ static int cmd_config_remove_tag(const struct shell *shell, size_t argc, char **
535553
if (memcmp(m_config_interim.addr[i], addr, BT_ADDR_SIZE) == 0) {
536554
memset(m_config_interim.addr[i], 0, BT_ADDR_SIZE);
537555
shell_print(shell, "tag addr: %s removed", argv[1]);
556+
557+
m_scan_tag_mask &= ~BIT(i);
558+
538559
return 0;
539560
}
540561
}
@@ -557,6 +578,8 @@ static int cmd_config_remove_tag(const struct shell *shell, size_t argc, char **
557578
memset(m_config_interim.addr[index], 0, BT_ADDR_SIZE);
558579
shell_print(shell, "tag index: %d removed", index);
559580

581+
m_scan_tag_mask &= ~BIT(index);
582+
560583
return 0;
561584
}
562585
}
@@ -574,6 +597,8 @@ static int cmd_config_clear_tags(const struct shell *shell, size_t argc, char **
574597
memset(m_config_interim.addr[i], 0, BT_ADDR_SIZE);
575598
}
576599

600+
m_scan_tag_mask = 0;
601+
577602
return 0;
578603
}
579604

@@ -762,19 +787,27 @@ static void start_scan_work_handler(struct k_work *work)
762787
return;
763788
}
764789

790+
m_scan_tag_flags = 0;
791+
765792
k_work_schedule_for_queue(&m_scan_work_q, &m_stop_scan_work,
766793
K_SECONDS(m_config.scan_duration));
767794
}
768795

769796
static void stop_scan_work_handler(struct k_work *work)
770797
{
771-
int ret = bt_le_scan_stop();
772-
if (ret) {
773-
LOG_ERR("Call `bt_le_scan_stop` failed: %d", ret);
774-
k_sem_give(&m_scan_sem);
775-
return;
798+
int ret;
799+
800+
if (!m_scan_early_stop) {
801+
ret = bt_le_scan_stop();
802+
if (ret) {
803+
LOG_ERR("Call `bt_le_scan_stop` failed: %d", ret);
804+
k_sem_give(&m_scan_sem);
805+
return;
806+
}
776807
}
777808

809+
m_scan_early_stop = false;
810+
778811
k_work_schedule_for_queue(&m_scan_work_q, &m_start_scan_work,
779812
K_SECONDS(m_config.scan_interval - m_config.scan_duration));
780813

@@ -838,6 +871,8 @@ static int init(void)
838871
LOG_ERR("Call `bt_le_filter_accept_list_add` failed: %d", ret);
839872
return ret;
840873
}
874+
875+
m_scan_tag_mask |= BIT(i);
841876
}
842877
}
843878

0 commit comments

Comments
 (0)