From 39842cc2707c7ceb890bd963d1d226cc7542bc91 Mon Sep 17 00:00:00 2001
From: zhangbo <zhangbo@qq.com>
Date: 星期五, 16 五月 2025 17:47:05 +0800
Subject: [PATCH] 对比PCA9555的修改

---
 keil/uwb_app.c |  235 ++++++----------------------------------------------------
 1 files changed, 26 insertions(+), 209 deletions(-)

diff --git a/keil/uwb_app.c b/keil/uwb_app.c
index fc6b031..13b32ec 100644
--- a/keil/uwb_app.c
+++ b/keil/uwb_app.c
@@ -12,7 +12,7 @@
 #include "PCA9555.h"
 
 #define TAG_KEEPTIMES           20
-#define REPORT_TAG_KEEPTIMES     1
+#define REPORT_TAG_KEEPTIMES     20
 
 #define GROUP_NUM   3
 uint16_t group_min_dist[GROUP_NUM+1];
@@ -98,6 +98,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 //yuan750 7500Haoyong
 #define POLL_RX_TO_RESP_TX_DLY_US 550U //yuan750 7500Haoyong
 
 #define RESP_TX_TO_FINAL_RX_DLY_US 500U
@@ -324,6 +325,8 @@
 uint16_t REPLY_POLL_NUM;
 uint16_t ERR_RX_NUM;
 uint8_t send_qiangzhan_NUM;
+uint8_t resp_tx_flag;
+uint32_t temp_c[10];
 static void rx_int_callback(struct MAC_HW_REPORT_T *rx_report)
 {		uint8_t valid_sts=0;
     // Power off radio
@@ -333,20 +336,25 @@
     if (rx_report->err_code == UWB_RX_OK)
     {
 			
-
+        resp_tx_flag=0;
         /* Received data does not contain FCS */
         rx_length = rx_report->pkt_len;
         memcpy(rx_buf, rx_report->pkt_data, rx_length);
         memcpy(&rx_rpt, rx_report, sizeof(struct MAC_HW_REPORT_T));
         /* Calculate rx timestamp */
-        temp_count= phy_timer_count_get();
+        
         poll_rx_en_start_u32 = rx_rpt.timestamp - phy_shr_duration();
         poll_rx_ts_i64 = ranging_rx_time_correct(&rx_rpt);
         poll_rx_num++;
 				REV_RX_NUM++;
         rssi = rx_report->rssi;
         receive_flag=1;
+				temp_count= phy_timer_count_get();
 				Anchor_App();
+			 if(resp_tx_flag==0)
+			{
+			  OpenUWB();
+			}
 			#ifdef STS_MODE
 				valid_sts= sts_valid_check();
       if (valid_sts)
@@ -378,9 +386,9 @@
 			  ERR_RX_NUM++;
 				UWB_STATE=UWB_STATE_IDLE;	
 
-			//	OpenUWB();//再次开启UWB接收
+				OpenUWB();//再次开启UWB接收
     }
-	OpenUWB();//再次开启UWB接收
+//	OpenUWB();//再次开启UWB接收
 #ifdef USE_TX_UWBON			
 				if(UWB_STATE==UWB_STATE_IDLE)
 				{
@@ -407,7 +415,7 @@
 			
         temp_count= phy_timer_count_get();
         temp_internal=temp_count;
-        
+        OpenUWB();
 			  TX_CALL_POLL_NUM++;
 //			  if(send_qiangzhan_NUM)
 //				{
@@ -530,7 +538,7 @@
 uint16_t response_num;
 uint8_t Anchor_RecNearPoll(uint8_t ancrec_nearbasepos)//根据自己是否为新基站定制消息去发送,根据是否抢占判断
 {
-    temp_count2=poll_rx_en_start_u32;
+//    temp_count2=phy_timer_count_get();
     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
@@ -549,7 +557,7 @@
 //				//这里应该有问题问一下钟工
 //		}//此处设置绝对时间将poll u32改为phy_timer_count_get()
 		position=ancrec_nearbasepos;
-	  temp_count1=phy_timer_count_get();
+	 
 		resp_tx_en_start_u32 = poll_rx_en_start_u32+US_TO_PHY_TIMER_COUNT(POLL_RX_TO_RESP_TX_DLY_US)+ancrec_nearbasepos*US_TO_PHY_TIMER_COUNT(DELAY_BETWEEN_TWO_FRAME_UUS);//加入帧间隔
 //    resp_tx_en_start_u32 = temp_count1+US_TO_PHY_TIMER_COUNT(POLL_RX_TO_RESP_TX_DLY_US)+ancrec_nearbasepos*US_TO_PHY_TIMER_COUNT(DELAY_BETWEEN_TWO_FRAME_UUS);//加入帧间隔
     resp_tx_ts_i64 = ranging_tx_time_correct(resp_tx_en_start_u32 + phy_shr_duration());//修正时间戳
@@ -558,10 +566,10 @@
     resp_msg_set_ts(&send_buffer[RESP_MSG_RESP_TX_TS_IDX], resp_tx_ts_i64);//此处时间戳int64直接转换为uint64不知道会不会有错误
     memcpy(&send_buffer[RESP_MSG_ANC_DISTOFFSET],&disoffset,2);//差个修正offset,修正有符号但是这个com表为无符号的,传过去直接赋给Int16_t相当于还原了
     temp_resp_i64=resp_tx_ts_i64;
-    temp_count3= phy_timer_count_get();
+    
     UWB_STATE==UWB_TX_STATE_BUSY;
 		flag_temp2=uwb_tx(send_buffer, 40,1 ,resp_tx_en_start_u32);//立即发送测试size大小
-   
+    resp_tx_flag=1;
 		
 		tagofflinetime[taglist_pos] = 0;//更新标签通信
 //    temp_count1=phy_timer_count_get();
@@ -584,146 +592,7 @@
 uint32_t UWB_fachu_count=0;
 uint32_t UWB_qiangzhanfachu_count=0;
 uint32_t UWB_1003_count,UWB_6666_count=0;
-//int UwbRange(void)
-//{
 
-//    uint8_t i;
-//    uint16_t tempid;
-
-//    mac_register_process_handler(tx_int_callback, rx_int_callback);
-//    receive_flag = 0;
-//		flag_recsuccess = 0;
-
-//    uwb_rxflag=uwb_rx(0, 0, range_timeout_us);//开启接收
-
-//    uwb_rxflag_num1++;
-//  //  while(mac_is_busy());
-//  //  temp_count2=phy_timer_count_get();
-//		start_receive_count=phy_timer_count_get();
-//	poll_timeout=US_TO_PHY_TIMER_COUNT(range_timeout_us);//多一个多0.4ms默认0.4ms计算为0.125*4*100000,默认开启1mss
-//	end_receive_count=start_receive_count+poll_timeout;
-//	if(end_receive_count>=UINT32_MAX)
-//	{end_receive_count-=UINT32_MAX;}
-//	current_count=phy_timer_count_get();
-//			while(mac_is_busy())
-//        {
-////            IdleTask();
-//            current_count=phy_timer_count_get();
-//            if(current_count>end_receive_count&&current_count<end_receive_count+HALF_SECOND_TIME)//超时时间为4.992秒
-//            {
-//                    break;
-//            }
-//        }
-//			
-//    if(receive_flag==1)//成功接收
-//    {
-//		time_count_sdsj=phy_timer_count_get();
-////			 gpio_pin_set(IO_PIN_5);
-//					
-////		gpio_pin_clr(IO_PIN_5);
-//		#ifdef DEBUG_BOXING
-////		gpio_pin_set(IO_PIN_5);//测试
-////		gpio_pin_clr(IO_PIN_5);//测试
-//		#endif
-////            timeceshi1=phy_timer_count_get();
-////            temp_count7=poll_rx_en_start_u32;
-//        receive_flag=0;
-//        if(group_id==rx_buf[GROUP_ID_IDX]&&rx_buf[MESSAGE_TYPE_IDX] == MBX_POLL)/*&&!memcmp(&rx_buf[TAG_ID_IDX],&g_com_map[BIND_DEV_ID],2)*///判断是否是和自己是同一组通讯的且为poll包
-//        {  
-////						UWB_shoudao_count++;
-//						flag_recsuccess = 1;
-////					  temp_count2=phy_timer_count_get();
-//            frame_seq_nb2 = rx_buf[SEQUENCE_IDX];//获取包序
-//            battary = rx_buf[BATTARY_IDX];
-//            rec_nearbase_num=rx_buf[FZ_NEARBASENUM_INDEX];  //标签传过来的他与基站交互的基站id数目
-//					
-//					  //rec_nearbase_num=25;  
-//					
-//            memcpy(&tag_id_recv,&rx_buf[TAG_ID_IDX],2);
-//            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);
-////            timeceshi1=phy_timer_count_get();
-////            temp_count7=poll_rx_en_start_u32;
-//					  taglist_pos=CmpTagInList(tag_id_recv);
-//            for(i=0; i<rec_nearbase_num; i++)
-//            {
-//							
-//                if(rec_ancidlist[i] == dev_id)
-//                {
-//                    rec_ancdistlist[i]+=(int16_t)g_com_map[DIST_OFFSET];
-//                    PushAnchorDataArray(tag_id_recv,rec_ancdistlist[i],battary);
-//									  UWB_fachu_count++;
-////		#ifdef DEBUG_BOXING
-//////		gpio_pin_clr(IO_PIN_5);//测试
-////		gpio_pin_set(IO_PIN_5);//测试
-////		#endif
-//                }
-//            }
-//            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(group_min_dist[group_id]>rec_ancdistlist[i])
-//                        {
-//                            group_min_dist[group_id] = 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)
-//            {
-//							
-//                seize_anchor=1;   //抢占anchor
-//                Anchor_RecNearPoll(i);
-//						  	UWB_qiangzhanfachu_count++;
-
-//            }
-//						recev_error_num=0;
-
-////            sleep_timer_start(__MS_TO_32K_CNT(UWB_DELAY_TIME_US));//测试
-////            LOG_INFO(TRACE_MODULE_APP,"标签ID:%X,距离: %d 信号强度:%d.\r\n",g_com_map[BIND_DEV_ID],distance,rssi);
-//       
-//				}
-//      //  uwb_rxflag=uwb_rx(0, 0, range_timeout_us);
-//    }    
-//		#ifdef DEBUG_BOXING
-////		gpio_pin_clr(IO_PIN_5);//测试
-////		gpio_pin_set(IO_PIN_5);//测试
-//		#endif
-//	
-//    delay_us(1);
-//    uwb_rx_force_off(1);
-////		gpio_pin_clr(IO_PIN_5); 
-////		#ifdef DEBUG_BOXING
-////		gpio_pin_clr(IO_PIN_5);//测试.
-////		#endif
-////		if(!flag_recsuccess)
-////		{
-////			sleep_timer_start(__MS_TO_32K_CNT(UWB_DELAY_TIME_US-3));//测试
-////        LOG_INFO(TRACE_MODULE_APP,"测距失败,计数:%d\r\n",recev_error_num);
-////        if(recev_error_num++>5)
-////        {
-////            recev_error_num=0;
-////            UWB_work_state=SEARCH_DEV;
-////            uwb_searchcount = 0;
-////            search_open_flag = 1;
-////        }
-////			}
-////		#ifdef DEBUG_BOXING
-////		gpio_pin_clr(IO_PIN_5);//测试
-//////		gpio_pin_set(IO_PIN_5);//测试
-////		#endif    
-//}
 int Uwbinit(void)
 {
     uwb_open();
@@ -837,78 +706,21 @@
 //uint32_t wltag_statetimer,wltag_uwbtimer;
 int uwb_app_poll(void)
 {
-
-	
-//	switch(wltag_state)
-//	{
-//	case RANGE:
-//	if(HIDO_TimerGetTick()-wltag_uwbtimer>2&&uwb_rx_flag==0)
-//		{ 
-//				
-//				wltag_uwbtimer = HIDO_TimerGetTick();
-//				if(UWB_STATE==UWB_STATE_IDLE)
-//				{
-//					UWB_STATE=UWB_RX_STATE_BUSY;
-//					OpenUWB();
-//				}
-//		}
-//		else if(HIDO_TimerGetTick()-wltag_uwbtimer>1&&uwb_rx_flag==1)
-//		{
-////			time_flag=HIDO_TimerGetTick()-wltag_uwbtimer;
-//		  	UWB_LED_OFF;
-//				wltag_uwbtimer = HIDO_TimerGetTick();
-//				CloseUWB();
-//			  UWB_STATE=UWB_STATE_IDLE;
-//		}
-//		if(uwb_losttimer>g_com_map[UWB_RNAGE_TIME])
-//		{ 
-//		 wltag_statetimer = HIDO_TimerGetTick();
-//			if(uwb_rx_flag==0)//若要切换到搜索模式时没有开启则开启UWB
-//			{
-//				if(UWB_STATE==UWB_STATE_IDLE)
-//				{
-//					UWB_STATE=UWB_RX_STATE_BUSY;
-//					OpenUWB();
-//				}
-//			}
-//     wltag_state = SEARCH;
-//		}
-//		break;
-//	case SEARCH:
-//		if(HIDO_TimerGetTick()-wltag_statetimer>1)
-//		{
-//			wltag_statetimer = HIDO_TimerGetTick();
-//			wltag_state = CLOSE;
-//			CloseUWB();
-//			UWB_STATE=UWB_STATE_IDLE;
-//		}
-//		break;
-//	case CLOSE:
-//		if(HIDO_TimerGetTick()-wltag_statetimer>g_com_map[UWB_WAIT_TIME])
-//		{
-//			wltag_statetimer = HIDO_TimerGetTick();
-//			wltag_state = SEARCH;
-//			if(UWB_STATE==UWB_STATE_IDLE)
-//			{
-//				UWB_STATE=UWB_RX_STATE_BUSY;
-//				OpenUWB();
-//			}
-//		}
-//		break;
-//	}
-
 	 UWBIdleTask();
 }
 
 //uint16_t REV_POLL_NUM;
 //uint16_t REPLY_POLL_NUM;
+extern uint8_t uwbled,gpsled,loraled,powerled;
 int Anchor_App(void)
 {
 				uint8_t i;
 				uint16_t tempid;
+	temp_count1=phy_timer_count_get();
 			if(group_id==rx_buf[GROUP_ID_IDX]&&rx_buf[MESSAGE_TYPE_IDX] == MBX_POLL)//判断是否是和自己是同一组通讯的且为poll包
         {    flag_recsuccess = 1;
 //						wltag_state=RANGE;//成功后从search切换为range
+					
 					  REV_POLL_NUM++;
 						memcpy(&g_com_receive_id,&rx_buf[TAG_ID_IDX],2);
 					  //temp_count2=phy_timer_count_get();
@@ -917,10 +729,14 @@
             battary = rx_buf[BATTARY_IDX];
             rec_nearbase_num=rx_buf[FZ_NEARBASENUM_INDEX];  //标签传过来的他与基站交互的基站id数目
             memcpy(&tag_id_recv,&rx_buf[TAG_ID_IDX],2);
+					temp_count2=phy_timer_count_get();
             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);
 						taglist_pos=CmpTagInList(tag_id_recv);
+					//	UWB_LED_ON;
+					  uwbled=1;
+					 temp_count3=phy_timer_count_get();
                 if(taglist_num>=ANC_MAX_NUM)
 										return 0;
 								 for(i=0; i<rec_nearbase_num; i++)
@@ -939,6 +755,7 @@
 												break;
 										}
 								}
+								 
 								 if((i==rec_nearbase_num&&taglist_pos==taglist_num)||(rec_nearbase_num==0&&!ExistInTagList(tag_id_recv)))//当基站不在标签列表中,标签也不在基站列表中时,随机找个时间片回复基站。
                 {
                        Anchor_RecNearPoll(rec_nearbase_num);

--
Gitblit v1.9.3