From da4743257980448c8e5de958d63c381ee7118359 Mon Sep 17 00:00:00 2001
From: yincheng.zhong <634916154@qq.com>
Date: 星期三, 07 六月 2023 15:52:55 +0800
Subject: [PATCH] V1.64 重大更新 1.修改初始化代码,降低设备待机功耗到100ua(原来500ua)。 2.待机模式(无标签)5秒测距一次。 3.增加基站心跳包功能,携带基站版本号,功率,小组ID,电量,校准距离等参数,每分钟输出一次。

---
 Src/application/dw_app.c |  106 +++++++++++++++++++++++++----------------------------
 1 files changed, 50 insertions(+), 56 deletions(-)

diff --git a/Src/application/dw_app.c b/Src/application/dw_app.c
index 7c6eb1f..0ac5c30 100644
--- a/Src/application/dw_app.c
+++ b/Src/application/dw_app.c
@@ -73,14 +73,14 @@
 static dwt_config_t config = {
 	5,               /* Channel number. */
 	DWT_PRF_64M,     /* Pulse repetition frequency. */
-	DWT_PLEN_128,    /* Preamble length. */
+	DWT_PLEN_64,    /* Preamble length. */
 	DWT_PAC8,        /* Preamble acquisition chunk size. Used in RX only. */
 	9,               /* TX preamble code. Used in TX only. */
 	9,               /* RX preamble code. Used in RX only. */
 	1,               /* Use non-standard SFD (Boolean) */
 	DWT_BR_6M8,      /* Data rate. */
 	DWT_PHRMODE_STD, /* PHY header mode. */
-	(129 + 8 - 8)    /* SFD timeout (preamble length + 1 + SFD length - PAC size). Used in RX only. */
+	(65 + 8 - 8)    /* SFD timeout (preamble length + 1 + SFD length - PAC size). Used in RX only. */
 };
 static uint8_t tx_poll_msg[20] = {0};
 static uint8_t tx_sync_msg[14] = {0};
@@ -321,7 +321,7 @@
 int32_t test2;
 uint16_t u16_nearbase_distlist[MAX_NEARBASE_NUM];
 uint8_t get_newdist,notenoughdist_count;
-void SetANCTimestap(uint8_t i,uint8_t* pollrx,uint8_t* resptx,uint32_t resprx,uint8_t* distoffset)
+void SetANCTimestap(uint8_t i,uint8_t* pollrx,uint8_t* resptx,uint32_t resprx,uint8_t* distoffset)  //写入时间戳信息
 {
     memcpy(&anc_pollrx[i],pollrx,4);
     memcpy(&anc_resptx[i],resptx,4);
@@ -329,7 +329,7 @@
     memcpy(&anc_distoffset[i],distoffset,2);
     anc_clockoffset[i] = test2;
 }
-void CalculateDists(void)
+void CalculateDists(void)   //计算距离
 {
     for(int i=0;i<MAX_NEARBASE_NUM;i++)
     {
@@ -351,6 +351,35 @@
     
     }
 }
+extern uint8_t module_power,imu_enable,motor_enable;
+void Registor_Poll(void)
+{
+	static u8 regpoll_count=0;
+    u8 timeout;
+		
+		tx_near_msg[MESSAGE_TYPE_IDX] = MBX_REG;
+        tx_near_msg[REGP_TAGSTATE_INDEX] = !GET_USERKEY<<2|imu_enable<<1|motor_enable;
+		tx_near_msg[REGP_FREQUENCY_INDEX] = bat_percent;
+		tx_near_msg[REGP_POWER_INDEX] = module_power;
+		memcpy(&tx_near_msg[REGP_VERSION_INDEX],&g_com_map[VERSION],2);	
+		memcpy(&tx_near_msg[REGP_IMUTHRES_INDEX],&g_com_map[GROUP_ID],2);
+		memcpy(&tx_near_msg[REGP_NOMOVESLEEPTIME_INDEX],&g_com_map[DIST_OFFSET],2);
+        memcpy(&tx_near_msg[REGP_HEIGHTOFFSET_INDEX],&g_com_map[MAX_REPORT_ANC_NUM],2);
+		dwt_writetxdata(23, tx_near_msg, 0);//将Poll包数据传给DW1000,将在开启发送时传出去
+		dwt_writetxfctrl(23, 0);//设置超宽带发送数据长度
+		dwt_starttx(DWT_START_TX_IMMEDIATE);//开启发送,发送完成后等待一段时间开启接收,等待时间在dwt_setrxaftertxdelay中设置
+        start_count=HAL_LPTIM_ReadCounter(&hlptim1);
+        timeout=50;
+        end_count=start_count+(timeout<<2);
+        while (!((status_reg = dwt_read32bitreg(SYS_STATUS_ID)) & (SYS_STATUS_TXFRS)))//不断查询芯片状态直到成功接收或者发生错误
+        { 
+            current_count=HAL_LPTIM_ReadCounter(&hlptim1);
+           if(current_count>=end_count&&current_count<end_count+15000)
+								break;
+            
+        };	
+               
+}
 float range_lost_time = 0;
 u16 rec_nearbaseid,rec_nearbasepos;
 void NearPoll(void)
@@ -369,12 +398,8 @@
 	{
 		nearbase_num = MAX_NEARBASE_NUM-1;
 	}
-//	HAL_GPIO_WritePin(LED0_GPIO, GPIO_PIN_9, GPIO_PIN_SET);
-//	last_nearbase_num=next_nearbase_num;
-//	nearbase_num=next_nearbase_num;
 	recbase_num=0;
-//	motor_state=0;
-    for(uint8_t i=0;i<nearbase_num;i++)
+    for(uint8_t i=0;i<nearbase_num;i++)   //标签距离32位转成16位
     {
         u16_nearbase_distlist[i] = nearbase_distlist[i];
     }
@@ -419,7 +444,7 @@
 								
 								dwt_forcetrxoff();
 								flag_rxon=0;
-                                if(flag_ancreadpara)
+                                if(flag_ancreadpara)   //只有在读取参数的时候需要回复
                                 {
                                     u16 calCRC;
                                   tx_near_msg[MESSAGE_TYPE_IDX] = MBX_PRAAREPLY;  
@@ -494,11 +519,6 @@
 										if(sync_timer>=1010)
 											{sync_timer=0;}
 									}
-								//	TIM3->CNT=tmp_time;
-//									if(tagslotpos>max_slotpos)
-//										tagslotpos=tagslotpos%(max_slotpos+1);
-//										tyncpoll_time=(tagslotpos-1)*slottime;
-									////////////////////////////
 									rec_nearbasepos=0;
 									exsistbase_list[rec_nearbasepos]=KEEP_TIMES;
 
@@ -524,28 +544,6 @@
 									dwt_writetxfctrl(28+nearbase_num*4, 0);//设定发送数据长度
 									flag_getresponse=1;
 									memcpy(&rec_tagpos_binary,&rx_buffer[NEARMSG_EMPTYSLOTPOS_INDEX],4);
-									
-								
-									//时间同步
-//									ancsync_time=((sync_timer)*1000+tmp_time);	
-//									last_slotnum=current_slotnum;
-//									current_slotnum=((float)sync_timer/g_com_map[COM_INTERVAL])+1;
-//									if(current_slotnum==last_slotnum-1)
-//									{flag_getresponse=1;}
-//									lastsync_timer=sync_timer;
-//									offsettimeus=ancsync_time-current_count*LPTIMER_LSB+offset;
-//									SetNextPollTime(tyncpoll_time);
-//									if(rec_remotepara_state==1)
-//									{
-//                             			memcpy(rec_remotepara,&rx_buffer[REMOTEPARA_INDEX],REMOTEPARA_LEN);
-//										memcpy(&g_com_map[COM_INTERVAL],&rec_remotepara[0],8);
-//										memcpy(&g_com_map[POWER],&rec_remotepara[8],10);
-//                                        if(g_com_map[COM_INTERVAL]>0&&g_com_map[COM_INTERVAL]<1000&&g_com_map[POWER]<67&&g_com_map[POWER]>0)
-//										{save_com_map_to_flash();
-//										delay_ms(100);										
-//                                        }
-//                                        NVIC_SystemReset();
-//									} 
 								}else{
 									rec_nearbasepos=FindNearBasePos(rec_nearbaseid);
 									SetANCTimestap(rec_nearbasepos,&rx_buffer[RESP_MSG_POLL_RX_TS_IDX],&rx_buffer[RESP_MSG_RESP_TX_TS_IDX],resp_rx_ts,&rx_buffer[RESP_MSG_ANC_DISTOFFSET]);
@@ -569,11 +567,6 @@
                
 									dwt_writetxdata(28+nearbase_num*4, tx_near_msg, 0);//将发送数据写入DW1000
 									dwt_writetxfctrl(28+nearbase_num*4, 0);//设定发送数据长度
-								
-
-									//dwt_setdelayedtrxtime(final_tx_time);//设置final包发送时间T5
-								//	result=dwt_starttx(DWT_START_TX_DELAYED);//设定为延迟发送			
-									//dwt_writetxdata(4,&tx_near_msg[FINAL_MSG_RESP_RX_NEARBASE_IDX+(rec_nearbasepos+1)*4], FINAL_MSG_RESP_RX_NEARBASE_IDX+(rec_nearbasepos+1)*4);//将发送数据写入DW1000
 								}								
 							}
 						}else{
@@ -629,25 +622,12 @@
 			}
 			
 			report_num=0;
-//            if(last_nearbase_num>4)
-//            {
-//                last_nearbase_num = 5;
-//            }
 	for (i=0;i<last_nearbase_num;i++)
 			{
 				nearbaseid_list[i]=true_nearbase_idlist[i];
 				nearbase_distlist[i]=true_nearbase_distlist[i];
                 exsistbase_list[i] = true_exsistbase_list[i];
 			}
-//            #ifdef USART_INTEGRATE_OUTPUT	
-//                usart_send[0] = 0x55;     
-//                usart_send[1] = 0xAA;              
-//				usart_send[2] = 4;//正常模式
-//				usart_send[3] = report_num*6+2;//正常模式
-//				checksum = Checksum_u16(&usart_send[2],report_num*6+2);
-//				memcpy(&usart_send[4+report_num*6],&checksum,2);
-//				USART_puts(usart_send,6+report_num*6);
-//			#endif
             
 	dwt_write32bitreg(SYS_STATUS_ID, SYS_STATUS_ALL_RX_ERR| SYS_STATUS_TXFRS |SYS_STATUS_RXFCG);
 //HAL_GPIO_WritePin(LED0_GPIO, GPIO_PIN_9, GPIO_PIN_RESET);
@@ -689,7 +669,7 @@
         }
     }
 }
-
+u8 regpoll_count;
 u32 id;
 void Tag_App(void)//发送模式(TAG标签)
 {
@@ -708,6 +688,20 @@
     }
     delay_us(100);
 	g_Resttimer=0;
+    if(freqlost_count>FREQ_LOST_TIME)
+    {
+        if(regpoll_count++>11) //待机状态1分钟上传一次基站状态
+        {
+            regpoll_count = 0;
+            Registor_Poll();
+        }
+    }else{
+        if(regpoll_count++>59)//测距状态1分钟上传一次基站状态
+        {
+            regpoll_count = 0;
+            Registor_Poll();
+        }
+    }
 	NearPoll();
 	dwt_entersleep();
     bat_percent=Get_VDDVlotage();

--
Gitblit v1.9.3