From 27956a4435c7cc37eee8fb908565b4ca8b1119ae Mon Sep 17 00:00:00 2001
From: yincheng.zhong <634916154@qq.com>
Date: 星期二, 28 二月 2023 16:15:07 +0800
Subject: [PATCH] V1.47 2

---
 Src/application/dw_app.c |  120 +++++++++++++++++++----------------------------------------
 1 files changed, 39 insertions(+), 81 deletions(-)

diff --git a/Src/application/dw_app.c b/Src/application/dw_app.c
index 560a5e4..cbc0205 100644
--- a/Src/application/dw_app.c
+++ b/Src/application/dw_app.c
@@ -70,14 +70,6 @@
 #define FINAL_MSG_RESP_RX_TS_IDX 14
 #define FINAL_MSG_FINAL_TX_TS_IDX 18
 #define FINAL_MSG_TS_LEN 4
-
-
-enum enumtagstate
-{
-	DISCPOLL,
-	GETNEARMSG,
-	NEARPOLL,
-}tag_state=NEARPOLL;
 static dwt_config_t config = {
 	5,               /* Channel number. */
 	DWT_PRF_64M,     /* Pulse repetition frequency. */
@@ -296,8 +288,23 @@
 u8 nearbase_num=0,last_nearbase_num,next_nearbase_num,last_slotnum, para_update,para_len,stationary_flag=0;
 u32 rec_tagpos_binary;
 int16_t offset=2700;
+u8 current_freq,rec_freq;
 u8 motor_state,rec_remotepara_state,rec_remotepara[80];
 extern u16 last_lpcount;
+float freqlost_count = 0;
+void TagFreqProcess(u8 freq)
+{
+    if(freq>MAX_ANCFREQ||freq==0)
+    {
+        return;
+    }
+    if(freq==tag_frequency||freq>tag_frequency)
+    {
+        tag_frequency = freq;
+        freqlost_count = 0;
+    }
+}
+
 void NearPoll(void)
 {
 	
@@ -325,7 +332,7 @@
 	tx_near_msg[SEQUENCE_IDX] = frame_seq_nb++;
 	tx_near_msg[NEARBASENUM_INDEX] = nearbase_num;
 	memcpy(&tx_near_msg[NEARBASEID_INDEX],&nearbaseid_list,nearbase_num*2);
-	tx_near_msg[MESSAGE_TYPE_IDX] = NEAR_POLL;	
+	tx_near_msg[MESSAGE_TYPE_IDX] = MBX_POLL;	
 	memcpy(&tx_near_msg[ANCHOR_ID_IDX],&mainbase_id,2);	
 	dwt_writetxdata(13+2*nearbase_num, tx_near_msg, 0);//将Poll包数据传给DW1000,将在开启发送时传出去
 	dwt_writetxfctrl(13+2*nearbase_num, 0);//设置超宽带发送数据长度
@@ -361,7 +368,7 @@
                                 if(flag_ancreadpara)
                                 {
                                     u16 calCRC;
-                                  tx_near_msg[MESSAGE_TYPE_IDX] = NEAR_PRAAREPLY;  
+                                  tx_near_msg[MESSAGE_TYPE_IDX] = MBX_PRAAREPLY;  
                                   memcpy(&tx_near_msg[MESSAGE_PARAREPLY_IDX],g_com_map,SENDANCPARA_LEN);
                                   calCRC = CRC_Compute((uint8_t*)g_com_map,SENDANCPARA_LEN);
                                   memcpy(&tx_near_msg[MESSAGE_PARAREPLY_IDX+SENDANCPARA_LEN],&calCRC,2);
@@ -389,13 +396,14 @@
 							dwt_readrxdata(rx_buffer, frame_len, 0);   //读取接收数据
 							dwt_setrxtimeout(0);//DELAY_BETWEEN_TWO_FRAME_UUS*(nearbase_num+1-recbase_num)+10);//设定接收超时时间,0位没有超时时间
 							dwt_rxenable(0);//打开接收
-							if (rx_buffer[MESSAGE_TYPE_IDX] == NEAR_RESPONSE&&!memcmp(&rx_buffer[TAG_ID_IDX],&dev_id,2)&&rx_buffer[GROUP_ID_IDX]==group_id) //判断接收到的数据是否是response数据
+							if (rx_buffer[MESSAGE_TYPE_IDX] == MBX_RESPONSE&&!memcmp(&rx_buffer[TAG_ID_IDX],&dev_id,2)&&rx_buffer[GROUP_ID_IDX]==group_id) //判断接收到的数据是否是response数据
 							{	u16 rec_nearbaseid,rec_nearbasepos;
 								poll_tx_ts = get_tx_timestamp_u64();										//获得POLL发送时间T1
 								resp_rx_ts = get_rx_timestamp_u64();										//获得RESPONSE接收时间T4	
 								recbase_num++;
 								memcpy(&rec_nearbaseid,&rx_buffer[ANCHOR_ID_IDX],2);
                                 rec_remotepara_state = rx_buffer[MOTORSTATE_INDEX]>>4;
+                                TagFreqProcess(rx_buffer[TAGFREQ_IDX]);
                                 if(rec_remotepara_state != 0)
                                 {   
                                     para_update = rec_remotepara_state;
@@ -451,7 +459,7 @@
 									final_msg_set_ts(&tx_near_msg[FINAL_MSG_POLL_TX_TS_IDX], poll_tx_ts);//将T1,T4,T5写入发送数据
 									final_msg_set_ts(&tx_near_msg[FINAL_MSG_RESP_RX_NEARBASE_IDX], resp_rx_ts);
 									final_msg_set_ts(&tx_near_msg[FINAL_MSG_FINAL_TX_TS_IDX], final_tx_ts);
-									tx_near_msg[MESSAGE_TYPE_IDX]=NEAR_FINAL;
+									tx_near_msg[MESSAGE_TYPE_IDX]=MBX_FINAL;
                                     tx_near_msg[GROUP_ID_IDX] = group_id;
 									
 									dwt_writetxdata(28+nearbase_num*4, tx_near_msg, 0);//将发送数据写入DW1000
@@ -597,7 +605,7 @@
         if(memcmp(&calCRC,&rec_remotepara[5],2)==0)
         {   uint8_t pack_msgtype,pack_index,pack_length;
             pack_msgtype = rec_remotepara[0];
-            pack_index = rec_remotepara[1];
+            pack_index = rec_remotepara[1]*2;
             pack_length = rec_remotepara[2];
             if(pack_msgtype==2)
             {
@@ -605,7 +613,14 @@
                 {
                
                //     motor_keeptime = rec_remotepara[3];
-                }else{
+                }else if(pack_index == CNT_UPDATE)
+								{
+										if(rec_remotepara[3]==2)
+										{
+											 	EnterUWBUpdateMode();
+										}
+								}								
+									else{
                     if(pack_index<200)
                     {
                         memcpy((uint8_t*)&g_com_map + pack_index, &rec_remotepara[3], pack_length);
@@ -620,83 +635,26 @@
         }
     }
 }
-u8 nearmsg_mainbase=0,rec_tagpos_emptylist[32];
-void GetNearMsg(void)
-{
-	u32 start_poll,frame_len;
-if(nearmsg_mainbase)
-	{nearmsg_mainbase=0;
-	}else{
-	nearmsg_mainbase=1;
-	}
-	memcpy(&tx_near_msg[ANCHOR_ID_IDX],&nearmsg_mainbase,2);
-	memcpy(&tx_near_msg[TAG_ID_IDX],&dev_id,2);
-    tx_near_msg[GROUP_ID_IDX] = group_id;
-	tx_near_msg[MESSAGE_TYPE_IDX] = NEAR_MSG;
-	
-	dwt_setrxaftertxdelay(POLL_TX_TO_RESP_RX_DLY_UUS);			//设置发送后开启接收,并设定延迟时间
-  dwt_setrxtimeout(RESP_RX_TIMEOUT_UUS);	
-	dwt_writetxdata(12, tx_near_msg, 0);//将Poll包数据传给DW1000,将在开启发送时传出去
-	dwt_writetxfctrl(12, 0);//设置超宽带发送数据长度
-	dwt_starttx(DWT_START_TX_IMMEDIATE| DWT_RESPONSE_EXPECTED);
 
-	/* We assume that the transmission is achieved correctly, poll for reception of a frame or error/timeout. See NOTE 8 below. */
-	while (!((status_reg = dwt_read32bitreg(SYS_STATUS_ID)) & (SYS_STATUS_RXFCG | SYS_STATUS_ALL_RX_ERR)))//不断查询芯片状态直到成功接收或者发生错误
-	{
-	};
-	if(status_reg==0xffffffff)
-	{
-		NVIC_SystemReset();
-	}
-	if (status_reg & SYS_STATUS_RXFCG)//如果成功接收
-	{
-		dwt_write32bitreg(SYS_STATUS_ID, SYS_STATUS_RXFCG | SYS_STATUS_TXFRS);//清楚寄存器标志位
-		frame_len = dwt_read32bitreg(RX_FINFO_ID) & RX_FINFO_RXFLEN_MASK;	//获得接收到的数据长度
-		dwt_readrxdata(rx_buffer, frame_len, 0);   //读取接收数据
-		if (rx_buffer[MESSAGE_TYPE_IDX] == NEAR_MSG&&!memcmp(&rx_buffer[TAG_ID_IDX],&dev_id,2)) //判断接收到的数据是否是response数据
-		{
-			nearbase_num=rx_buffer[NEARBASENUM_INDEX];
-			memcpy(&rec_tagpos_binary,&rx_buffer[NEARMSG_EMPTYSLOTPOS_INDEX],4);
-			tagslotpos=GetRandomSlotPos(rec_tagpos_binary);
-			//tagslotpos=rx_buffer[TAGSLOTPOS];
-			memcpy(nearbaseid_list,&rx_buffer[NEARBASEID_INDEX],nearbase_num*2);
-			//slottime=ceil((nearbase_num+2)*0.3)+1;
-			tyncpoll_time=tagslotpos*slottime;
-			tag_state=NEARPOLL;
-		}
-	}else{
-			tyncpoll_time = (tagslotpos--%max_slotpos)*slottime;
-	}
-}
 u32 id;
 void Tag_App(void)//发送模式(TAG标签)
 {
 	
 	//LED0_ON;
 	id =  dwt_readdevid() ;
-	    while (DWT_DEVICE_ID != id) 
+	while (DWT_DEVICE_ID != id) 
     {
-			id =  dwt_readdevid() ;
+        u8 iderror_count = 0;
+        id =  dwt_readdevid() ;
+        if(iderror_count++>100)
+        {
+            printf("UWB芯片ID错误");
+            break;
+        }
     }
-
+    delay_us(100);
 	g_Resttimer=0;
-//	tag_state=DISCPOLL;
-	switch(tag_state)
-	{
-		case DISCPOLL:
-		//	Poll();
-			break;
-		case GETNEARMSG:
-
-				GetNearMsg();
-	 
-			break;
-		case NEARPOLL:
-			//GPIO_WriteBit(EU_TX_GPIO, EU_RX_PIN, Bit_SET);
-			NearPoll();
-			//GPIO_WriteBit(EU_TX_GPIO, EU_RX_PIN, Bit_RESET);
-			break;
-	}
+	NearPoll();
 	dwt_entersleep();
     bat_percent=Get_VDDVlotage();
 }

--
Gitblit v1.9.3