From 5e02aaa74bd161d42cd3a48dc5d6f89491ea29ef Mon Sep 17 00:00:00 2001
From: chen <15335560115@163.com>
Date: 星期二, 31 十二月 2024 16:17:51 +0800
Subject: [PATCH] 新测距算法加入,稳定测距版本

---
 keil/uwb_app.c |  177 ++++++++++++++++++++++++++++++++++++++--------------------
 1 files changed, 115 insertions(+), 62 deletions(-)

diff --git a/keil/uwb_app.c b/keil/uwb_app.c
index c81a59b..5aa320d 100644
--- a/keil/uwb_app.c
+++ b/keil/uwb_app.c
@@ -78,7 +78,7 @@
 #define RANGING_PERIOD_MS (1000)
 
 /* This is the delay from Frame RX POLL frame to send RESP Frame */
-#define POLL_RX_TO_RESP_TX_DLY_US 550U //yuan600 success 并且不卡busy
+#define POLL_RX_TO_RESP_TX_DLY_US 550U //yuan550极限
 
 #define RESP_TX_TO_FINAL_RX_DLY_US 500U
 
@@ -392,17 +392,35 @@
 //		}
 		
 }
+//uint16_t CmpTagInList(uint16_t tagid)
+//{   uint16_t i;
+//    for(i=0; i<taglist_num; i++)
+//    {
+//        if(memcmp(&tagid,&anchordata_id[i],2)==0)
+//            break;
+//    }
+//    if(i==taglist_num)
+//        return taglist_num;
+//    //tagofflinetime[i] = 0;
+//    return i;
+//}yuan
 uint16_t CmpTagInList(uint16_t tagid)
 {   uint16_t i;
     for(i=0; i<taglist_num; i++)
     {
-        if(memcmp(&tagid,&anchordata_id[i],2)==0)
+        if(memcmp(&tagid,&tagid_list[i],2)==0)
             break;
     }
-    if(i==taglist_num)
-        return taglist_num;
-    //tagofflinetime[i] = 0;
     return i;
+}
+uint16_t ExistInTagList(uint16_t tagid)
+{   uint16_t i;
+    for(i=0; i<taglist_num; i++)
+    {
+        if(memcmp(&tagid,&tagid_list[i],2)==0)
+            return 1;
+    }
+    return 0;
 }
 
 uint16_t CmpCarInExistList(uint16_t tagid)
@@ -429,20 +447,33 @@
     }
 }
 
+//void TagListUpdate(void)
+//{
+//    uint8_t i,j=0;
+//    for(i=0; i<anchordata_num; i++)
+//    {
+//        if(tagofflinetime[i]++<QUIT_SLOT_TIME)
+//        {
+//            anchordata_id[j]=anchordata_id[i];
+//            tagofflinetime[j++]=tagofflinetime[i];
+//        }
+//    }
+//    anchordata_num=j;
+//}
 void TagListUpdate(void)
 {
-    uint8_t i,j=0;
-    for(i=0; i<anchordata_num; i++)
+uint16_t i,j=0,k=0;
+    for(i=0; i<taglist_num; i++)
     {
-        if(tagofflinetime[i]++<QUIT_SLOT_TIME)
+			 if(tagofflinetime[i]++<TAG_KEEPTIMES)
         {
-            anchordata_id[j]=anchordata_id[i];
+            tagid_list[j]=tagid_list[i];
+            tagdist_list[j] = tagdist_list[i];
             tagofflinetime[j++]=tagofflinetime[i];
         }
-    }
-    anchordata_num=j;
+		}
+		 taglist_num=j;
 }
-
 
 uint8_t position;
 uint8_t Anchor_RecNearPoll(uint8_t ancrec_nearbasepos)//根据自己是否为新基站定制消息去发送,根据是否抢占判断
@@ -476,6 +507,7 @@
     temp_resp_i64=resp_tx_ts_i64;
     temp_count3= phy_timer_count_get();
     flag_temp2=uwb_tx(send_buffer, 40,1 ,resp_tx_en_start_u32);//立即发送测试size大小
+		tagofflinetime[taglist_pos] = 0;//更新标签通信
 //    temp_count1=phy_timer_count_get();
     //while(mac_is_busy());
     //gpio_pin_clr(SCL_PIN);
@@ -581,32 +613,32 @@
 //				wltag_uwbtimer = HIDO_TimerGetTick();
 //				CloseUWB();
 //		}
-////		if(uwb_losttimer>g_com_map[UWB_RNAGE_TIME])
-////		{ 
-////		 wltag_statetimer = HIDO_TimerGetTick();
-////			if(uwb_rx_flag==0)//若要切换到搜索模式时没有开启则开启UWB
-////			{
-////				OpenUWB();
-////			}
-////     wltag_state = SEARCH;
-////		}
+//		if(uwb_losttimer>g_com_map[UWB_RNAGE_TIME])
+//		{ 
+//		 wltag_statetimer = HIDO_TimerGetTick();
+//			if(uwb_rx_flag==0)//若要切换到搜索模式时没有开启则开启UWB
+//			{
+//				OpenUWB();
+//			}
+//     wltag_state = SEARCH;
+//		}
 //		break;
-////	case SEARCH:
-////		if(HIDO_TimerGetTick()-wltag_statetimer>1)
-////		{
-////		wltag_statetimer = HIDO_TimerGetTick();
-////    wltag_state = CLOSE;
-////    CloseUWB();
-////		}
-////		break;
-////	case CLOSE:
-////		if(HIDO_TimerGetTick()-wltag_statetimer>g_com_map[UWB_WAIT_TIME])
-////		{
-////		wltag_statetimer = HIDO_TimerGetTick();
-////    wltag_state = SEARCH;
-////    OpenUWB();
-////		}
-////		break;
+//	case SEARCH:
+//		if(HIDO_TimerGetTick()-wltag_statetimer>1)
+//		{
+//		wltag_statetimer = HIDO_TimerGetTick();
+//    wltag_state = CLOSE;
+//    CloseUWB();
+//		}
+//		break;
+//	case CLOSE:
+//		if(HIDO_TimerGetTick()-wltag_statetimer>g_com_map[UWB_WAIT_TIME])
+//		{
+//		wltag_statetimer = HIDO_TimerGetTick();
+//    wltag_state = SEARCH;
+//    OpenUWB();
+//		}
+//		break;
 //	}
 	 UWBIdleTask();
 }
@@ -627,34 +659,55 @@
             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);
-            for(i=0; i<rec_nearbase_num; i++)
-            {
-                if(rec_ancidlist[i] == dev_id)
-                {		temp_recdist_before_offset=rec_ancdistlist[i];
-                    rec_ancdistlist[i]+=(int16_t)g_com_map[DIST_OFFSET];
-                    PushAnchorDataArray(tag_id_recv,rec_ancdistlist[i],battary);
-                }
-            }
-            for(i=0; i<rec_nearbase_num; i++)
-            {
-                memcpy(&tempid,&rx_buf[FZ_NEARBASEID_INDEX+i*2],2);
-                if(tempid==dev_id)//也是比id如果有就更新没有就抢占
-                {
-                    seize_anchor=0;  //非抢占。已存在列表中
-                    Anchor_RecNearPoll(i);
-                    break;
-                }
-            }
+//            for(i=0; i<rec_nearbase_num; i++)
+//            {
+//                if(rec_ancidlist[i] == dev_id)
+//                {		temp_recdist_before_offset=rec_ancdistlist[i];
+//                    rec_ancdistlist[i]+=(int16_t)g_com_map[DIST_OFFSET];
+//                    PushAnchorDataArray(tag_id_recv,rec_ancdistlist[i],battary);
+//                }
+//            }
+//            for(i=0; i<rec_nearbase_num; i++)
+//            {
+//                memcpy(&tempid,&rx_buf[FZ_NEARBASEID_INDEX+i*2],2);
+//                if(tempid==dev_id)//也是比id如果有就更新没有就抢占
+//                {
+//                    seize_anchor=0;  //非抢占。已存在列表中
+//                    Anchor_RecNearPoll(i);
+//                    break;
+//                }
+//            }
 
-            if(i==rec_nearbase_num)
-            {
-                seize_anchor=1;   //抢占anchor
-                Anchor_RecNearPoll(i);
-            }
-				}else{
-			//	OpenUWB();//接收到不是自己的包再次开启UWB接收
+//            if(i==rec_nearbase_num)
+//            {
+//                seize_anchor=1;   //抢占anchor
+//                Anchor_RecNearPoll(i);
+//            }
+								taglist_pos=CmpTagInList(tag_id_recv);
+                if(taglist_num>=ANC_MAX_NUM)
+										return 0;
+								 for(i=0; i<rec_nearbase_num; i++)
+								{
+										memcpy(&tempid,&rx_buf[FZ_NEARBASEID_INDEX+i*2],2);
+										if(tempid==dev_id)
+										{
+												Anchor_RecNearPoll(i);
+												tagdist_list[taglist_pos]=rec_ancdistlist[i];
+												if(taglist_pos==taglist_num)// taglist_pos==taglist_num 说明这个基站不在当前列表中
+												{   //tempid==dev_id 说明基站下发测距报文有这个标签的信息
+														taglist_num++;          //满足上述两种情况才会添加基站ID进入列表中,否则会出现标签不在基站列表中,标签也不响应的情况
+														tagid_list[taglist_pos] = tag_id_recv;
+												}
+												break;
+										}
+								}
+								 if((i==rec_nearbase_num&&taglist_pos==taglist_num)||(rec_nearbase_num==0&&!ExistInTagList(tag_id_recv)))//当基站不在标签列表中,标签也不在基站列表中时,随机找个时间片回复基站。
+                {
+                       Anchor_RecNearPoll(rec_nearbase_num);
+                }
 				}
 				
+				
 }
 int UwbRange(void)
 {

--
Gitblit v1.9.3