#include "dw_app.h" #define FANGCHAI 7 #define FREQ_OFFSET_MULTIPLIER (998.4e6/2.0/1024.0/131072.0) #define FREQ_OFFSET_MULTIPLIER_110KB (998.4e6/2.0/8192.0/131072.0) // Multiplication factors to convert frequency offset in Hertz to PPM crystal offset // NB: also changes sign so a positive value means the local RX clock is running slower than the remote TX device. #define HERTZ_TO_PPM_MULTIPLIER_CHAN_1 (-1.0e6/3494.4e6) #define HERTZ_TO_PPM_MULTIPLIER_CHAN_2 (-1.0e6/3993.6e6) #define HERTZ_TO_PPM_MULTIPLIER_CHAN_3 (-1.0e6/4492.8e6) #define HERTZ_TO_PPM_MULTIPLIER_CHAN_5 (-1.0e6/6489.6e6) extern uint16_t tag_frequency; static uint8_t send_buffer[200],rx_buffer[200]; static uint8_t trygetnearmsg_times,bigslot_num,tagslotpos,nearbase_num,result,outrange_times; static uint8_t changemainbase_count,mainbase_lost_count; static uint16_t frame_len,sync_timer,tmp_time,basesystimer,mainbase_id,frame_seq_nb; static uint16_t nearbaseid_list[MAX_NEARBASE_NUM],nearbaseid_list2[MAX_NEARBASE_NUM],rec_anc_signalpower[MAX_NEARBASE_NUM],exsistbase_list[MAX_NEARBASE_NUM]; static uint16_t nearbase_switchdistlist[MAX_NEARBASE_NUM],u16_nearbase_distlist[MAX_NEARBASE_NUM]; static uint32_t status_reg; static int32_t nearbase_distlist[MAX_NEARBASE_NUM]; static uint64_t poll_tx_ts,resp_rx_ts,final_tx_ts; static uint64_t get_tx_timestamp_u64(void) { uint8_t ts_tab[5]; uint64_t ts = 0; int i; dwt_readtxtimestamp(ts_tab); for (i = 4; i >= 0; i--) { ts <<= 8; ts |= ts_tab[i]; } return ts; } static uint64_t get_rx_timestamp_u64(void) { uint8_t ts_tab[5]; uint64_t ts = 0; int i; dwt_readrxtimestamp(ts_tab); for (i = 4; i >= 0; i--) { ts <<= 8; ts |= ts_tab[i]; } return ts; } static void final_msg_set_ts(uint8_t *ts_field, uint64_t ts) { int i; for (i = 0; i < FINAL_MSG_TS_LEN; i++) { ts_field[i] = (uint8_t) ts; ts >>= 8; } } static void final_msg_get_ts(const uint8_t *ts_field, uint32_t *ts) { int i; *ts = 0; for (i = 0; i < FINAL_MSG_TS_LEN; i++) { *ts += ts_field[i] << (i * 8); } } static uint8_t FindNearBasePos(uint16_t baseid) { uint8_t i; for(i=0;i-10&&distance<1000) { nearbase_distlist[i] = distance*100+anc_distoffset[i]; g_Resttimer=0; }else{ // nearbase_distlist[i] = distance*100+anc_distoffset[i]; } if(nearbase_distlist[i]>100000) { tof = 1; } }else{ // nearbase_distlist[i] = 0x1ffff; } } // rtd_init = resp_rx_ts - poll_tx_ts; // rtd_resp = resp_tx_ts - poll_rx_ts; // tof = ((rtd_init - rtd_resp * (1 - clockOffsetRatio)) / 2.0) * DWT_TIME_UNITS; // distance = tof * SPEED_OF_LIGHT; // nearbase_distlist[] } extern uint8_t group_id; #define BASELOST_STOPMOTOR_TIME 5 static int32_t mainbase_dist,true_nearbase_distlist[MAX_NEARBASE_NUM],true_exsistbase_list[MAX_NEARBASE_NUM],ancsync_time,nextpoll_delaytime,offsettimeus; static uint8_t anclost_times=0; static uint8_t report_num,get_newbase=0; static uint8_t flag_finalsend,flag_getresponse,flag_rxon; static uint16_t current_count,start_count,end_count,lastsync_timer,true_nearbase_idlist[MAX_NEARBASE_NUM]; static int32_t temp_dist; static uint8_t last_nearbase_num,next_nearbase_num,last_slotnum, para_update,para_len,tag_succ_times,recbase_num; static uint32_t rec_tagpos_binary; static int16_t offset=2700,g_commap_antdelay=0; uint8_t motor_state,ancnum,thistime_ancnum; static uint8_t rec_remotepara_state,rec_remotepara[80],t1; static uint32_t temp1,temp2,dw_systime; void NearPoll(void) { uint32_t frame_len; uint32_t final_tx_time; uint32_t start_poll; uint8_t i,j,getsync_flag=0,timeout; dwt_setrxaftertxdelay(10); //ÉèÖ÷¢ËÍºó¿ªÆô½ÓÊÕ£¬²¢É趨ÑÓ³Ùʱ¼ä dwt_setrxtimeout(4000); tag_succ_times = 0; //GPIO_WriteBit(GPIOA, GPIO_Pin_10, Bit_SET); if(next_nearbase_num>=MAX_NEARBASE_NUM) { next_nearbase_num = MAX_NEARBASE_NUM-1; } for(uint8_t i=0;i=32768) { end_count-=32768; } current_count=HAL_LPTIM_ReadCounter(&hlptim1); get_newbase=0; while(current_countend_count+15000) { while (!((status_reg = dwt_read32bitreg(SYS_STATUS_ID)) & (SYS_STATUS_RXFCG | SYS_STATUS_ALL_RX_ERR)))//²»¶Ï²éѯоƬ״ֱ̬µ½³É¹¦½ÓÊÕ»òÕß·¢Éú´íÎó { current_count=HAL_LPTIM_ReadCounter(&hlptim1); if(current_count>=end_count&¤t_count>4; mainbase_lost_count=0; // flag_finalsend=1; // memcpy(&mainbase_dist,&rx_buffer[DIST_IDX],4); // final_tx_time = (resp_rx_ts + ((RESP_RX_TO_FINAL_TX_DLY_UUS+DELAY_BETWEEN_TWO_FRAME_UUS*nearbase_num+500) * UUS_TO_DWT_TIME)) >> 8; // temp1=final_tx_time-((850*UUS_TO_DWT_TIME)>>8); // temp2=final_tx_time+((100*UUS_TO_DWT_TIME)>>8); // // dwt_setdelayedtrxtime(final_tx_time);//ÉèÖÃfinal°ü·¢ËÍʱ¼äT5 // final_tx_ts = (((uint64_t)(final_tx_time & 0xFFFFFFFE)) << 8) + TX_ANT_DLY;//final°üʵ¼Ê·¢ËÍʱ¼äÊǼÆËãʱ¼ä¼ÓÉÏ·¢ËÍÌìÏßdelay // final_msg_set_ts(&send_buffer[FINAL_MSG_POLL_TX_TS_IDX], poll_tx_ts);//½«T1£¬T4£¬T5дÈë·¢ËÍÊý¾Ý // final_msg_set_ts(&send_buffer[FINAL_MSG_RESP_RX_NEARBASE_IDX], resp_rx_ts); // final_msg_set_ts(&send_buffer[FINAL_MSG_FINAL_TX_TS_IDX], final_tx_ts); // send_buffer[MESSAGE_TYPE_IDX]=NEAR_FINAL; // send_buffer[GROUP_ID_IDX] = group_id; // dwt_writetxdata(28+nearbase_num*4, send_buffer, 0);//½«·¢ËÍÊý¾ÝдÈëDW1000 // dwt_writetxfctrl(28+nearbase_num*4, 0);//É趨·¢ËÍÊý¾Ý³¤¶È flag_getresponse=1; }else{ rec_nearbasepos=FindNearBasePos(rec_nearbaseid); if(rec_nearbasepos>=last_nearbase_num) //·¢ÏÖеĻùÕ¾ { get_newbase=1; nearbase_num++; nearbaseid_list[rec_nearbasepos] = rec_nearbaseid; memcpy(&send_buffer[ANCHOR_ID_IDX],&rec_nearbaseid,2); } 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]); exsistbase_list[rec_nearbasepos]=KEEP_TIMES; //memcpy(&temp_dist,&rx_buffer[DIST_IDX],4); //// temp_dist = nearbase_distlist[rec_nearbasepos]; //// nearbase_distlist[rec_nearbasepos]=temp_dist; if(motor_state<(rx_buffer[MOTORSTATE_INDEX]&0xf)&&(rx_buffer[MOTORSTATE_INDEX]&0xf)!=3) { motor_state=rx_buffer[MOTORSTATE_INDEX]; } final_msg_set_ts(&send_buffer[FINAL_MSG_RESP_RX_NEARBASE_IDX+(rec_nearbasepos)*4], resp_rx_ts); dwt_writetxdata(28+nearbase_num*4, send_buffer, 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,&send_buffer[FINAL_MSG_RESP_RX_NEARBASE_IDX+(rec_nearbasepos+1)*4], FINAL_MSG_RESP_RX_NEARBASE_IDX+(rec_nearbasepos+1)*4);//½«·¢ËÍÊý¾ÝдÈëDW1000 } } }else{ dwt_write32bitreg(SYS_STATUS_ID,SYS_STATUS_RXFCG| SYS_STATUS_ALL_RX_ERR); if(flag_rxon) {dwt_rxenable(0); } } // dwt_write32bitreg(SYS_STATUS_ID,SYS_STATUS_RXFCG| SYS_STATUS_ALL_RX_ERR); } if(mainbase_lost_count>tag_frequency*BASELOST_STOPMOTOR_TIME) {motor_state=0; } dwt_write32bitreg(SYS_STATUS_ID,SYS_STATUS_RXFCG| SYS_STATUS_ALL_RX_ERR); nearbase_num=recbase_num; j=0; CalculateDists(); delay_us(10); if(exsistbase_list[0]==0) { } // tyncpoll_time=0; next_nearbase_num=0; for(i=0;i0) { next_nearbase_num++; true_exsistbase_list[j]=exsistbase_list[i]; true_nearbase_idlist[j]=nearbaseid_list[i]; true_nearbase_distlist[j++]=nearbase_distlist[i]; exsistbase_list[i]--; } } if(recbase_num<3) {next_nearbase_num=next_nearbase_num;} last_nearbase_num = next_nearbase_num; for(i=0;itrue_nearbase_distlist[j+1]) { uint32_t temp_dist,temp_id,temp_exsis; temp_dist=true_nearbase_distlist[j]; temp_id = true_nearbase_idlist[j]; temp_exsis=true_exsistbase_list[i]; true_nearbase_distlist[j]=true_nearbase_distlist[j+1]; true_nearbase_idlist[j]=true_nearbase_idlist[j+1]; true_exsistbase_list[j]=true_exsistbase_list[j+1]; true_nearbase_distlist[j+1]=temp_dist; true_nearbase_idlist[j+1]=temp_id; true_exsistbase_list[j+1]=temp_exsis; } } } report_num=0; for (i=0;i=32768) { lpcount1 -=32768; } __HAL_LPTIM_COMPARE_SET(&hlptim1, lpcount1); } thistime_ancnum = recbase_num; dwt_write32bitreg(SYS_STATUS_ID, SYS_STATUS_ALL_RX_ERR| SYS_STATUS_TXFRS |SYS_STATUS_RXFCG); }