From b20f94fd39346787a0e99940f0370aae0d84090a Mon Sep 17 00:00:00 2001
From: chen <15335560115@163.com>
Date: 星期六, 21 六月 2025 18:18:34 +0800
Subject: [PATCH] 无感闸机基站第一版,增加存授权表和查表逻辑,将接收标签id改为4字节,但是未找到tagupdate直接回将tagnum清0的问题,导致一直抢占

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

diff --git a/keil/uwb_app.c b/keil/uwb_app.c
index 7d8709c..42e12c3 100644
--- a/keil/uwb_app.c
+++ b/keil/uwb_app.c
@@ -35,10 +35,11 @@
 static uint16_t ancidlist_rec[TAG_NUM_IN_SYS],ancidlist_send[TAG_NUM_IN_SYS],rec_ancidlist[TAG_NUM_IN_SYS];
 static int16_t rec_ancdistlist[TAG_NUM_IN_SYS];
 extern uint8_t group_id;
-static uint16_t anc_id_recv,tag_id_recv;
+static uint16_t anc_id_recv;
+static uint32_t tag_id_recv;
 static int16_t rec_antdelay;
 extern uint32_t dev_id;
-static uint16_t taglist_pos,tmp_time;
+static uint32_t taglist_pos,tmp_time;
 extern uint16_t tag_frequency;
 extern uint16_t disoffset;
 static uint8_t frame_len,recpoll_len,current_syncid,new_tagid,seize_anchor,result,g_start_sync_flag;
@@ -47,7 +48,7 @@
 //resp函数
 void PushAnchorDataArray(uint16_t ancid,int16_t dist,uint8_t battary);//找到自己的id信息对应位置更新自己的交互信息
 static void resp_msg_set_ts(uint8_t *ts_field, int64_t ts);//用来对应位置放入时间戳
-static uint16_t tagid_list[TAG_NUM_IN_SYS];
+static uint32_t tagid_list[TAG_NUM_IN_SYS];
 uint16_t CmpTagInList(uint16_t tagid);
 uint8_t Anchor_RecNearPoll(uint8_t ancrec_nearbasepos);
 static uint8_t send_buffer[100];
@@ -67,6 +68,7 @@
 extern uint8_t recev_error_num;
 uint8_t uwb_rx_flag;
 extern Operation_step UWB_work_state;
+void find_in_tag_id_authorization_list(uint32_t authorization_list_num);
 extern int16_t first_search_flag;
 typedef enum 
 {
@@ -461,6 +463,8 @@
 //    }
 //    anchordata_num=j;
 //}
+uint8_t find_flag;
+extern uint32_t tag_id_authorization_list_num;
 void TagListUpdate(void)
 {
 uint16_t i,j=0,k=0;
@@ -475,6 +479,11 @@
         }
 		}
 		 taglist_num=j;
+		if(find_flag)
+		{
+		find_in_tag_id_authorization_list(tag_id_authorization_list_num);
+		find_flag=0;
+		}
 }
 
 uint8_t position;
@@ -484,7 +493,7 @@
 
     memcpy(&send_buffer[GROUP_ID_IDX],&group_id,1);//组id
     memcpy(&send_buffer[ANCHOR_ID_IDX],&dev_id,2);//自身id
-    memcpy(&send_buffer[TAG_ID_IDX],&tag_id_recv,2);//接受者id
+    memcpy(&send_buffer[TAG_ID_IDX],&tag_id_recv,4);//接受者id
     send_buffer[MESSAGE_TYPE_IDX]=MBX_RESPONSE;
 
 //    if(rec_nearbase_num == ancrec_nearbasepos)//抢占模式自己为新基站
@@ -644,6 +653,69 @@
 //	}
 	 UWBIdleTask();
 }
+uint8_t tag_authorized_List[TAG_NUM_IN_SYS];
+extern uint8_t bind_flag;
+void bubble_sort(uint32_t *arr, uint32_t n)
+{
+ if (n <= 1) return;  // 无需排序
+    
+    uint32_t i, j;
+    uint8_t swapped;  // 标记是否发生交换
+    
+    for (i = 0; i < n - 1; i++) {
+        swapped = 0;  // 重置交换标记
+        
+        // 每轮将最大元素"冒泡"到末尾
+        for (j = 0; j < n - i - 1; j++) {
+            if (arr[j] > arr[j + 1]) {
+                // 交换相邻元素
+                uint32_t temp = arr[j];
+                arr[j] = arr[j + 1];
+                arr[j + 1] = temp;
+                swapped = 1;  // 标记发生了交换
+            }
+        }
+        
+        // 优化:如果本轮未发生交换,说明数组已排序
+        if (!swapped) break;
+    }
+}
+void copy_taglist_to_flash(void)
+{
+memcpy(&tag_id_authorization_list,&tagid_list,taglist_num*4);
+//进行排序后存入,为二分法做基础
+bubble_sort(&tag_id_authorization_list,taglist_num);
+save_taglist_map_to_flash();
+}
+
+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];
+            
+            if (mid_val == target) {
+                found = 1;
+                break;  // 找到目标值,立即退出循环
+            } else if (mid_val < target) {
+                left = mid + 1;
+            } else {
+                right = mid - 1;
+            }
+        }
+        
+        // 存储查找结果
+        tag_authorized_List[i] = found;
+    }
+}
+
 int Anchor_App(void)
 {
 				uint8_t i;
@@ -657,7 +729,7 @@
             frame_seq_nb2 = rx_buf[SEQUENCE_IDX];//获取包序
             battary = rx_buf[BATTARY_IDX];
             rec_nearbase_num=rx_buf[FZ_NEARBASENUM_INDEX];  //标签传过来的他与基站交互的基站id数目
-            memcpy(&tag_id_recv,&rx_buf[TAG_ID_IDX],2);
+            memcpy(&tag_id_recv,&rx_buf[TAG_ID_IDX],4);
             memcpy(rec_ancidlist,&rx_buf[FZ_NEARBASEID_INDEX],2*rec_nearbase_num);
             memcpy(rec_ancdistlist,&rx_buf[FZ_NEARBASEID_INDEX+2*rec_nearbase_num],2*rec_nearbase_num);
             memcpy(&rec_antdelay,&rx_buf[FZ_NEARBASEID_INDEX+rec_nearbase_num*4],2);
@@ -699,8 +771,8 @@
 												if(taglist_pos==taglist_num)// taglist_pos==taglist_num 说明这个基站不在当前列表中
 												{   //tempid==dev_id 说明基站下发测距报文有这个标签的信息
 														taglist_num++;          //满足上述两种情况才会添加基站ID进入列表中,否则会出现标签不在基站列表中,标签也不响应的情况
-														tagid_list[taglist_pos] = tag_id_recv;
-														
+														tagid_list[taglist_pos] = tag_id_recv;//新增基站
+														find_flag=1;
 												}
 												break;
 										}

--
Gitblit v1.9.3