@@ -59,6 +59,9 @@ struct ble_tag_data {
59
59
static struct ble_tag_data tag_data [CTR_BLE_TAG_COUNT ];
60
60
K_MUTEX_DEFINE (tag_data_lock );
61
61
62
+ static uint8_t m_scan_tag_mask , m_scan_tag_flags ;
63
+ static bool m_scan_early_stop ;
64
+
62
65
static volatile bool m_enrolling = false;
63
66
static char m_enroll_addr_str [BT_ADDR_SIZE * 2 + 1 ];
64
67
@@ -212,6 +215,18 @@ static void scan_cb(const bt_addr_le_t *addr, int8_t rssi, uint8_t adv_type,
212
215
k_sem_give (& m_has_enrolled_sem );
213
216
}
214
217
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
+
215
230
tag_data [i ].rssi = rssi ;
216
231
tag_data [i ].valid = true;
217
232
@@ -492,6 +507,9 @@ static int cmd_config_add_tag(const struct shell *shell, size_t argc, char **arg
492
507
for (size_t i = 0 ; i < CTR_BLE_TAG_COUNT ; i ++ ) {
493
508
if (ctr_ble_tag_is_addr_empty (m_config_interim .addr [i ])) {
494
509
memcpy (m_config_interim .addr [i ], addr , BT_ADDR_SIZE );
510
+
511
+ m_scan_tag_mask |= BIT (i );
512
+
495
513
return 0 ;
496
514
} else if (memcmp (m_config_interim .addr [i ], addr , BT_ADDR_SIZE ) == 0 ) {
497
515
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 **
535
553
if (memcmp (m_config_interim .addr [i ], addr , BT_ADDR_SIZE ) == 0 ) {
536
554
memset (m_config_interim .addr [i ], 0 , BT_ADDR_SIZE );
537
555
shell_print (shell , "tag addr: %s removed" , argv [1 ]);
556
+
557
+ m_scan_tag_mask &= ~BIT (i );
558
+
538
559
return 0 ;
539
560
}
540
561
}
@@ -557,6 +578,8 @@ static int cmd_config_remove_tag(const struct shell *shell, size_t argc, char **
557
578
memset (m_config_interim .addr [index ], 0 , BT_ADDR_SIZE );
558
579
shell_print (shell , "tag index: %d removed" , index );
559
580
581
+ m_scan_tag_mask &= ~BIT (index );
582
+
560
583
return 0 ;
561
584
}
562
585
}
@@ -574,6 +597,8 @@ static int cmd_config_clear_tags(const struct shell *shell, size_t argc, char **
574
597
memset (m_config_interim .addr [i ], 0 , BT_ADDR_SIZE );
575
598
}
576
599
600
+ m_scan_tag_mask = 0 ;
601
+
577
602
return 0 ;
578
603
}
579
604
@@ -762,19 +787,27 @@ static void start_scan_work_handler(struct k_work *work)
762
787
return ;
763
788
}
764
789
790
+ m_scan_tag_flags = 0 ;
791
+
765
792
k_work_schedule_for_queue (& m_scan_work_q , & m_stop_scan_work ,
766
793
K_SECONDS (m_config .scan_duration ));
767
794
}
768
795
769
796
static void stop_scan_work_handler (struct k_work * work )
770
797
{
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
+ }
776
807
}
777
808
809
+ m_scan_early_stop = false;
810
+
778
811
k_work_schedule_for_queue (& m_scan_work_q , & m_start_scan_work ,
779
812
K_SECONDS (m_config .scan_interval - m_config .scan_duration ));
780
813
@@ -838,6 +871,8 @@ static int init(void)
838
871
LOG_ERR ("Call `bt_le_filter_accept_list_add` failed: %d" , ret );
839
872
return ret ;
840
873
}
874
+
875
+ m_scan_tag_mask |= BIT (i );
841
876
}
842
877
}
843
878
0 commit comments