From a95c209ade37589fa69990670da2506f5d10cc88 Mon Sep 17 00:00:00 2001
From: chen <15335560115@163.com>
Date: 星期日, 22 六月 2025 16:47:29 +0800
Subject: [PATCH] 无感闸机测试可用版本,解决多标签时数组访问越界问题,存入授权表问题,但是多个设备的控制gpio的关断间隔过短,导致频繁开关未解决

---
 keil/uwb_app.c |   86 +++++++++++++++++++++++++++++++++----------
 1 files changed, 66 insertions(+), 20 deletions(-)

diff --git a/keil/uwb_app.c b/keil/uwb_app.c
index 42e12c3..6cc31ff 100644
--- a/keil/uwb_app.c
+++ b/keil/uwb_app.c
@@ -449,7 +449,7 @@
         ts2 >>= 8;
     }
 }
-
+uint8_t tt5=0;
 //void TagListUpdate(void)
 //{
 //    uint8_t i,j=0;
@@ -481,6 +481,7 @@
 		 taglist_num=j;
 		if(find_flag)
 		{
+//			if(tt5)
 		find_in_tag_id_authorization_list(tag_id_authorization_list_num);
 		find_flag=0;
 		}
@@ -690,30 +691,65 @@
 
 void find_in_tag_id_authorization_list(uint32_t authorization_list_num)
 {
- for (uint32_t i = 0; i < taglist_num; i++) {
-        uint32_t target = tagid_list[i];
-        uint32_t left = 0;
-        uint32_t right = authorization_list_num - 1;  // 授权列表的最大索引
-        uint8_t found = 0;
-        
-        // 二分查找循环
-        while (left <= right) {
-            uint32_t mid = left + ((right - left) >> 1);  // 防止整数溢出
-            uint32_t mid_val = tag_id_authorization_list[mid];
+// for (uint32_t i = 0; i < taglist_num; i++) {
+//        uint32_t target = tagid_list[i];
+//        uint32_t left = 0;
+//        uint32_t right = authorization_list_num - 1;  // 授权列表的最大索引
+//        uint8_t found = 0;
+//        
+//        // 二分查找循环
+//        while (left <= right) {
+//            uint32_t mid = left + ((right - left) >> 1);  // 防止整数溢出
+//            uint32_t mid_val = tag_id_authorization_list[mid];
+//            
+//            if (mid_val == target) {
+//                found = 1;
+//                break;  // 找到目标值,立即退出循环
+//            } else if (mid_val < target) {
+//                left = mid + 1;
+//            } else {
+//                right = mid - 1;
+//            }
+//						 LOG_INFO(TRACE_MODULE_APP, "DEBUG: i=%u, left=%d, right=%d, found=%u\n", i, left, right, found);
+//        }
+////        
+////        // 存储查找结果
+////        tag_authorized_List[i] = found;
+//    }
+{
+    // 如果授权列表为空,直接全部标记为0
+    if (authorization_list_num == 0) {
+        for (int i = 0; i < taglist_num; i++) {
+            tag_authorized_List[i] = 0;
+        }
+        return;
+    }
+
+    // 遍历需要查找的每个ID
+    for (int i = 0; i < taglist_num; i++) {
+        int key = tagid_list[i];
+        int low = 0;
+        int high = authorization_list_num - 1;
+        int found = 0; // 标记是否找到
+
+        // 在授权列表中执行二分查找
+        while (low <= high) {
+            int mid = low + (high - low) / 2; // 防止整数溢出
             
-            if (mid_val == target) {
-                found = 1;
-                break;  // 找到目标值,立即退出循环
-            } else if (mid_val < target) {
-                left = mid + 1;
+            if (tag_id_authorization_list[mid] == key) {
+                found = 1; // 找到匹配项
+                break;
+            } else if (tag_id_authorization_list[mid] < key) {
+                low = mid + 1; // 在右半部分继续查找
             } else {
-                right = mid - 1;
+                high = mid - 1; // 在左半部分继续查找
             }
         }
-        
-        // 存储查找结果
-        tag_authorized_List[i] = found;
+
+        // 根据查找结果设置输出列表
+        tag_authorized_List[i] = found ? 1 : 0;
     }
+}
 }
 
 int Anchor_App(void)
@@ -765,9 +801,19 @@
 										memcpy(&tempid,&rx_buf[FZ_NEARBASEID_INDEX+i*2],2);
 										if(tempid==dev_id)
 										{
+												
 												Anchor_RecNearPoll(i);
 												tagdist_list[taglist_pos]=rec_ancdistlist[i];
 												anchordata_bat[taglist_pos] = battary;//保存该基站电量
+											if(tag_authorized_List[taglist_pos]==1)
+											{
+												if(tagdist_list[taglist_pos]<100)
+												{
+												gpio_pin_set(BUTTON_PIN);
+												}else{
+												gpio_pin_clr(BUTTON_PIN);
+												}
+											}
 												if(taglist_pos==taglist_num)// taglist_pos==taglist_num 说明这个基站不在当前列表中
 												{   //tempid==dev_id 说明基站下发测距报文有这个标签的信息
 														taglist_num++;          //满足上述两种情况才会添加基站ID进入列表中,否则会出现标签不在基站列表中,标签也不响应的情况

--
Gitblit v1.9.3