From 67e9f19a27e24c4804ebe321c72951380637fef2 Mon Sep 17 00:00:00 2001 From: zhyinch <zhyinch@gmail.com> Date: 星期五, 13 十一月 2020 12:15:36 +0800 Subject: [PATCH] 1 --- Src/application/dw_app.c | 226 ++++++++++++++++++++++++++++---------------------------- 1 files changed, 114 insertions(+), 112 deletions(-) diff --git a/Src/application/dw_app.c b/Src/application/dw_app.c index c1e0ea2..08c29a5 100644 --- a/Src/application/dw_app.c +++ b/Src/application/dw_app.c @@ -69,14 +69,14 @@ #define FINAL_MSG_FINAL_TX_TS_IDX 18 #define FINAL_MSG_TS_LEN 4 - +#define STARTPOLL DISCPOLL enum enumtagstate { REGPOLL, DISCPOLL, GETNEARMSG, NEARPOLL, -}tag_state=DISCPOLL; +}tag_state=STARTPOLL; static dwt_config_t config = { 2, /* Channel number. */ DWT_PRF_64M, /* Pulse repetition frequency. */ @@ -458,7 +458,7 @@ delay_ms(30); } -int32_t mainbase_dist,nearbase_distlist[MAX_NEARBASE_NUM],true_nearbase_distlist[MAX_NEARBASE_NUM],true_exsistbase_list[MAX_NEARBASE_NUM],ancsync_time,nextpoll_delaytime,offsettimeus; +int32_t mainbase_dist,nearbase_switchdistlist[MAX_NEARBASE_NUM],nearbase_distlist[MAX_NEARBASE_NUM],true_nearbase_distlist[MAX_NEARBASE_NUM],true_exsistbase_list[MAX_NEARBASE_NUM],ancsync_time,nextpoll_delaytime,offsettimeus; u8 anclost_times=0 , mainbase_lost_count=0; u8 exsistbase_list[MAX_NEARBASE_NUM],report_num,get_newbase=0; u8 flag_finalsend,flag_getresponse,flag_rxon; @@ -584,7 +584,7 @@ tyncpoll_time=(tagslotpos-1)*slottime; } mainbase_id=minid; - //mainbase_id = 0x2; +// mainbase_id = 0x9804; } u8 nearmsg_mainbase=0,rec_tagpos_emptylist[32],mainbase_type;; void GetNearMsg(void) @@ -619,18 +619,19 @@ { nearbase_num=rx_buffer[NEARBASENUM_INDEX]; memcpy(&rec_tagpos_binary,&rx_buffer[NEARMSG_EMPTYSLOTPOS_INDEX],4); - tagslotpos=GetRandomSlotPos(rec_tagpos_binary); + // 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; - tyncpoll_time=(g_com_map[DEV_ID]%max_slotpos)*slottime; + //tyncpoll_time=(g_com_map[DEV_ID]%max_slotpos)*slottime; tag_state=NEARPOLL; } }else{ tyncpoll_time = (tagslotpos--%max_slotpos)*slottime; } } +extern u8 userkey_state; uint8_t changemainbase_count=0,gotosleep_flag; uint32_t frame_len; void NearPoll(void) @@ -652,14 +653,18 @@ HAL_GPIO_WritePin(LED0_GPIO, GPIO_PIN_9, GPIO_PIN_SET); recbase_num=0; - motor_state=0; +// motor_state=0; tx_near_msg[BATTARY_IDX] = bat_percent; - tx_near_msg[BUTTON_IDX] = !GET_USERKEY|stationary_flag<<1|gotosleep_flag<<2; + tx_near_msg[BUTTON_IDX] = userkey_state|stationary_flag<<1|gotosleep_flag<<2; 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[NEARP_TAGFREQ_INDEX] = tag_frequency; + tx_near_msg[NEARP_TAGSLOTPOS_INDEX] = tagslotpos; + memcpy(&tx_near_msg[ANCHOR_ID_IDX],&mainbase_id,2); dwt_writetxdata(21+2*nearbase_num, tx_near_msg, 0);//将Poll包数据传给DW1000,将在开启发送时传出去 dwt_writetxfctrl(21+2*nearbase_num, 0);//设置超宽带发送数据长度 @@ -712,21 +717,19 @@ memcpy(&sync_timer,&rx_buffer[ANCTIMEMS],2); memcpy(&tmp_time,&rx_buffer[ANCTIMEUS],2); current_count=HAL_LPTIM_ReadCounter(&hlptim1); -// memcpy(&tagslotpos,&rx_buffer[TAGSLOTPOS],2); - tmp_time=tmp_time+450; - if(tmp_time>999) - { - tmp_time-=999; - sync_timer++; - 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; - //////////////////////////// - + dwt_forcetrxoff(); + final_tx_time = (resp_rx_ts + ((RESP_RX_TO_FINAL_TX_DLY_UUS) * UUS_TO_DWT_TIME)) >> 8; + final_tx_ts = (((uint64_t)(final_tx_time & 0xFFFFFFFE)) << 8) + TX_ANT_DLY;//final包实际发送时间是计算时间加上发送天线delay + 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+nearbase_num*4], 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; + 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);//设定为延迟发送 + userkey_state = !GET_USERKEY; + memcpy(&temp_dist,&rx_buffer[DIST_IDX],4); mainbase_dist=temp_dist; if((rx_buffer[MOTORSTATE_INDEX]&0xf)!=3) @@ -744,51 +747,47 @@ para_len = frame_len-22; memcpy(rec_remotepara,&rx_buffer[REMOTEPARA_INDEX],para_len); } - flag_getresponse=1; - memcpy(&rec_tagpos_binary,&rx_buffer[NEARMSG_EMPTYSLOTPOS_INDEX],4); - final_msg_set_ts(&tx_near_msg[FINAL_MSG_RESP_RX_NEARBASE_IDX], resp_rx_ts); - + flag_getresponse=1; //时间同步 + tmp_time=tmp_time+450; + if(tmp_time>999) + { + tmp_time-=999; + sync_timer++; + if(sync_timer>=1000) + {sync_timer=0;} + } ancsync_time=((sync_timer)*1000+tmp_time); last_slotnum=current_slotnum; - // current_slotnum=((float)sync_timer/(SLOTTIME_MS*bigslot_num))+1; + current_slotnum=((float)(sync_timer*10)/(SLOTTIME_MS*bigslot_num))+1; if(current_slotnum==last_slotnum-1) {flag_getresponse=1;} lastsync_timer=sync_timer; offsettimeus=ancsync_time-current_count*LPTIMER_LSB+offset; -// SetNextPollTime(tagslotpos); - + SetNextPollTime(tagslotpos); + if(result==0) + {while (!(dwt_read32bitreg(SYS_STATUS_ID) & SYS_STATUS_TXFRS))//不断查询芯片状态直到发送完成 + { };} + break; }else{ rec_nearbasepos=FindNearBasePos(rec_nearbaseid); exsistbase_list[rec_nearbasepos]=KEEP_TIMES; memcpy(&temp_dist,&rx_buffer[DIST_IDX],4); + memcpy(&nearbase_switchdistlist[rec_nearbasepos],&rx_buffer[NR_NEARSWITCH_DISTANCE],2); nearbase_distlist[rec_nearbasepos]=temp_dist; - final_msg_set_ts(&tx_near_msg[FINAL_MSG_RESP_RX_NEARBASE_IDX+(rec_nearbasepos+1)*4], resp_rx_ts); - if(rec_nearbasepos + 1 == nearbase_num) - { - dwt_forcetrxoff(); - final_tx_time = (resp_rx_ts + ((RESP_RX_TO_FINAL_TX_DLY_UUS) * UUS_TO_DWT_TIME)) >> 8; - final_tx_ts = (((uint64_t)(final_tx_time & 0xFFFFFFFE)) << 8) + TX_ANT_DLY;//final包实际发送时间是计算时间加上发送天线delay - 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_FINAL_TX_TS_IDX], final_tx_ts); - tx_near_msg[MESSAGE_TYPE_IDX]=NEAR_FINAL; - 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);//设定为延迟发送 - if(result==0) - {while (!(dwt_read32bitreg(SYS_STATUS_ID) & SYS_STATUS_TXFRS))//不断查询芯片状态直到发送完成 - { };} - break; + final_msg_set_ts(&tx_near_msg[FINAL_MSG_RESP_RX_NEARBASE_IDX+(rec_nearbasepos)*4], resp_rx_ts); + if(temp_dist<nearbase_switchdistlist[rec_nearbasepos]&&nearbase_switchdistlist[rec_nearbasepos]!=0&&temp_dist!=0) + { + mainbase_id = rec_nearbaseid; + tag_state = GETNEARMSG; } } } }else{ dwt_write32bitreg(SYS_STATUS_ID,SYS_STATUS_RXFCG| SYS_STATUS_ALL_RX_ERR); - if(recbase_num!=nearbase_num) + if(recbase_num!=nearbase_num+1) {dwt_rxenable(0); } // if(flag_rxon) // { @@ -797,6 +796,7 @@ } // dwt_write32bitreg(SYS_STATUS_ID,SYS_STATUS_RXFCG| SYS_STATUS_ALL_RX_ERR); } + dwt_forcetrxoff(); dwt_write32bitreg(SYS_STATUS_ID,SYS_STATUS_RXFCG| SYS_STATUS_ALL_RX_ERR); j=0; if(exsistbase_list[0]==0) @@ -804,65 +804,66 @@ // SetNextPollTime(tagslotpos); } // tyncpoll_time=0; - next_nearbase_num=0; - for(i=0;i<nearbase_num;i++) - { - if(exsistbase_list[i]>0) - { - 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]--; - } - } +// next_nearbase_num=0; +// for(i=0;i<nearbase_num;i++) +// { +// if(exsistbase_list[i]>0) +// { +// 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;i<last_nearbase_num-1;i++) - { - for(j=0;j<last_nearbase_num-1;j++) - { - if(true_nearbase_distlist[j]>true_nearbase_distlist[j+1]) - { - u32 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; - } - } - } - if(true_nearbase_distlist[0]<mainbase_dist-THRESHOLD_CHANGE_MAINBASE_DIST&&true_exsistbase_list[0]) - { - changemainbase_count++; - }else{ - changemainbase_count = 0; - } - if(changemainbase_count>3) - { - mainbase_id = true_nearbase_idlist[0]; - tag_state = GETNEARMSG; - } - if(mainbase_lost_count>3) - { - tag_state = DISCPOLL; - } - for (i=0;i<nearbase_num;i++) - { - if(nearbaseid_list[i]==0) - { - tag_state = GETNEARMSG; - } - - } +// if(recbase_num<3) +// {next_nearbase_num=next_nearbase_num;} +// last_nearbase_num = next_nearbase_num; +// for(i=0;i<last_nearbase_num-1;i++) +// { +// for(j=0;j<last_nearbase_num-1;j++) +// { +// if(true_nearbase_distlist[j]>true_nearbase_distlist[j+1]) +// { +// u32 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; +// } +// } +// } + +// if(true_nearbase_distlist[0]<mainbase_dist-THRESHOLD_CHANGE_MAINBASE_DIST&&true_exsistbase_list[0]) +// { +// changemainbase_count++; +// }else{ +// changemainbase_count = 0; +// } +// if(changemainbase_count>3) +// { +// mainbase_id = true_nearbase_idlist[0]; +// tag_state = GETNEARMSG; +// } +// if(mainbase_lost_count>3) +// { +// tag_state = DISCPOLL; +// } +// for (i=0;i<nearbase_num;i++) +// { +// if(nearbaseid_list[i]==0) +// { +// tag_state = GETNEARMSG; +// } +// +// } //串口输出距离 // report_num=0; // for (i=0;i<last_nearbase_num;i++) @@ -876,10 +877,10 @@ // report_num++; // } // } - for(i=0;i<MAX_NEARBASE_NUM;i++) - { - nearbase_distlist[i]=0x1ffff; - } +// for(i=0;i<MAX_NEARBASE_NUM;i++) +// { +// nearbase_distlist[i]=0x1ffff; +// } if(para_update) { uint8_t pack_length = 0,pack_index = 0,pack_msgtype = 0; @@ -971,7 +972,7 @@ {flag_getresponse=1;} lastsync_timer=sync_timer; offsettimeus=ancsync_time-current_count*LPTIMER_LSB+offset; - SetNextPollTime(tagslotpos); +// SetNextPollTime(tagslotpos); mainbase_id=rec_nearbaseid; nearbase_num=rx_buffer[NEARBASENUM_INDEX]; memcpy(nearbaseid_list,&rx_buffer[NEARBASEID_INDEX],nearbase_num*2); @@ -987,6 +988,7 @@ id = dwt_readdevid() ; while (DWT_DEVICE_ID != id) { + Dw1000_Init(); id = dwt_readdevid() ; } switch(tag_state) -- Gitblit v1.9.3