From 9d2282974b45aecf66adbd707fcde1ea83456703 Mon Sep 17 00:00:00 2001 From: zhyinch <zhyinch@gmail.com> Date: 星期一, 01 六月 2020 15:02:52 +0800 Subject: [PATCH] 11 --- 源码/核心板/Src/application/dw_app.c | 218 +++++++++++++++++++++++++++++++----------------------- 1 files changed, 125 insertions(+), 93 deletions(-) diff --git "a/\346\272\220\347\240\201/\346\240\270\345\277\203\346\235\277/Src/application/dw_app.c" "b/\346\272\220\347\240\201/\346\240\270\345\277\203\346\235\277/Src/application/dw_app.c" index e5cbeb5..1b499a2 100644 --- "a/\346\272\220\347\240\201/\346\240\270\345\277\203\346\235\277/Src/application/dw_app.c" +++ "b/\346\272\220\347\240\201/\346\240\270\345\277\203\346\235\277/Src/application/dw_app.c" @@ -5,7 +5,7 @@ DISCPOLL, GETNEARMSG, NEARPOLL, -}tag_state; +}tag_state=GETNEARMSG; static dwt_config_t config = { 2, /* Channel number. */ DWT_PRF_64M, /* Pulse repetition frequency. */ @@ -25,6 +25,8 @@ static uint8_t tx_nearpoll_msg[80] = {0}; static uint8_t tx_nearresp_msg[80] = {0}; static uint8_t tx_nearfinal_msg[80] = {0}; + +static uint8_t tx_near_msg[80] = {0}; static uint32_t frame_seq_nb = 0; static uint32_t status_reg = 0; @@ -219,36 +221,36 @@ } u8 recbase_num=0; #define CHANGE_BASE_THRESHOLD 5 -void NearAncSelect(void) -{static u16 last_mainbase_id,change_base_count; - int32_t nearbase_mindist=99999, nearbase_minpos; - u8 i; - for(i=0;i<recbase_num-1;i++) - { - if(nearbase_mindist>nearbase_distlist[i]) - { - nearbase_mindist=nearbase_distlist[i]; - nearbase_minpos=i; - } - } - if(nearbase_mindist<mainbase_dist-THRESHOLD_CHANGE_MAINBASE_DIST) - { - if(last_mainbase_id==nearbaseid_list[nearbase_minpos]) - { - change_base_count++; - if(change_base_count>CHANGE_BASE_THRESHOLD) - { - mainbase_id=last_mainbase_id; - tag_state=GETNEARMSG; - } - }else{ - change_base_count=0; - } - last_mainbase_id=nearbaseid_list[nearbase_minpos]; - }else{ - change_base_count=0; - } -} +//void NearAncSelect(void) +//{static u16 last_mainbase_id,change_base_count; +// int32_t nearbase_mindist=99999, nearbase_minpos; +// u8 i; +// for(i=0;i<recbase_num-1;i++) +// { +// if(nearbase_mindist>nearbase_distlist[i]) +// { +// nearbase_mindist=nearbase_distlist[i]; +// nearbase_minpos=i; +// } +// } +// if(nearbase_mindist<mainbase_dist-THRESHOLD_CHANGE_MAINBASE_DIST) +// { +// if(last_mainbase_id==nearbaseid_list[nearbase_minpos]) +// { +// change_base_count++; +// if(change_base_count>CHANGE_BASE_THRESHOLD) +// { +// mainbase_id=last_mainbase_id; +// tag_state=GETNEARMSG; +// } +// }else{ +// change_base_count=0; +// } +// last_mainbase_id=nearbaseid_list[nearbase_minpos]; +// }else{ +// change_base_count=0; +// } +//} u8 test=0; u8 anclost_times=0; u8 exsistbase_list[MAX_NEARBASE_NUM],report_num,get_newbase=0;; @@ -551,51 +553,72 @@ } - -//void GetNearMsg(void) -//{ -// u32 start_poll,frame_len; -// memcpy(&tx_near_msg[ANCHOR_ID_IDX],&mainbase_id,2); -// memcpy(&tx_near_msg[TAG_ID_IDX],&dev_id,2); -// 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); -// start_poll = time32_incr; -// /* 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(time32_incr - start_poll>20) -// NVIC_SystemReset(); -// }; -// 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]; -// 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; -// } -// } -//} +u8 nearmsg_mainbase=0; +u32 rec_tagpos_binary; +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[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); + start_poll = time32_incr; + /* 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(time32_incr - start_poll>20) + NVIC_SystemReset(); + }; + 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数据 + { + next_nearbase_num=rx_buffer[NEARBASENUM_INDEX]; + memcpy(&rec_tagpos_binary,&rx_buffer[NEARMSG_EMPTYSLOTPOS_INDEX],4); + tagslotpos=rx_buffer[TAGSLOTPOS]; + memcpy(nearbaseid_list,&rx_buffer[NEARBASEID_INDEX],next_nearbase_num*2); + slottime=ceil((nearbase_num+2)*0.3)+1; + tyncpoll_time=tagslotpos*slottime; + tag_state=NEARPOLL; + } + } +} void Tag_App(void)//发送模式(TAG标签) { //LED0_ON; g_Resttimer=0; - NearPoll(); + switch(tag_state) + { + case DISCPOLL: + + break; + case GETNEARMSG: + GetNearMsg(); + break; + case NEARPOLL: + NearPoll(); + break; + + + } + } int8_t correction_time,new_tagid=0; @@ -702,7 +725,7 @@ dwt_write32bitreg(SYS_STATUS_ID, SYS_STATUS_ALL_RX_ERR); } } -u8 misdist_num,seize_anchor; +u8 misdist_num[TAG_NUM_IN_SYS],seize_anchor; u8 Anchor_RecNearPoll(u8 ancrec_nearbasepos) //0 mainbase 1 first near_base { tmp_time=TIM3->CNT; @@ -785,9 +808,9 @@ g_flag_Taggetdist[taglist_pos]=0; if(hex_dist>-1000&&hex_dist<100000) { - if(abs(hex_dist-his_dist[taglist_pos])<1500||misdist_num>3) + if(abs(hex_dist-his_dist[taglist_pos])<1500||misdist_num[taglist_pos]>3) { - misdist_num=0; + misdist_num[taglist_pos]=0; tagdist_list[taglist_pos] = hex_dist; his_dist[taglist_pos]=hex_dist; #ifndef USART_INTEGRATE_OUTPUT @@ -809,7 +832,7 @@ #endif }else{ // printf("%d",hex_dist); - misdist_num++; + misdist_num[taglist_pos]++; } } } @@ -822,6 +845,9 @@ } uint32_t current_syncid=0xffffffff,synclost_timer; extern u8 flag_syncbase; +extern uint32_t tagpos_binary; +u8 tagpos_rec[50],tagpos_send[50],ancidlist_num; +u16 ancidlist_rec[20],ancidlist_send[20]; void Anchor_App(void) { @@ -841,7 +867,7 @@ if (status_reg & SYS_STATUS_RXFCG)//成功接收 { u16 tag_recv_interval; - + float temp_tagpos; dwt_write32bitreg(SYS_STATUS_ID, SYS_STATUS_RXFCG);//清除标志位 frame_len = dwt_read32bitreg(RX_FINFO_ID) & RX_FINFO_RXFL_MASK_1023;//获得接收数据长度 dwt_readrxdata(rx_buffer, frame_len, 0);//读取接收数据 @@ -879,21 +905,22 @@ } break; -// case NEAR_MSG: -// if(anc_id_recv==dev_id) -// { -// rx_buffer[TAGSLOTPOS]=taglist_pos; -// tx_near_msg[MESSAGE_TYPE_IDX] = NEAR_MSG; -// memcpy(&tx_near_msg[TAG_ID_IDX],&tag_id_recv,2); -// tx_near_msg[NEARBASENUM_INDEX]=g_com_map[NEARBASE_NUM]; -// memcpy(&tx_near_msg[NEARBASEID_INDEX],&g_com_map[NEARBASE_ID1],g_com_map[NEARBASE_NUM]*2); -// send_len=11+g_com_map[NEARBASE_NUM]*2+2; -// dwt_writetxdata(send_len, tx_near_msg, 0);//将Poll包数据传给DW1000,将在开启发送时传出去 -// dwt_writetxfctrl(send_len, 0);//设置超宽带发送数据长度 -// dwt_starttx(DWT_START_TX_IMMEDIATE); -// } -// break; -// + case NEAR_MSG: + if(anc_id_recv==flag_syncbase) + { + rx_buffer[TAGSLOTPOS]=taglist_pos; + tx_near_msg[MESSAGE_TYPE_IDX] = NEAR_MSG; + memcpy(&tx_near_msg[TAG_ID_IDX],&tag_id_recv,2); + memcpy(&tx_near_msg[NEARMSG_EMPTYSLOTPOS_INDEX],&tagpos_binary,4); + tx_near_msg[NEARBASENUM_INDEX]=ancidlist_num; + memcpy(&tx_near_msg[NEARBASEID_INDEX],&ancidlist_send,ancidlist_num*2); + send_len=11+ancidlist_num*2+2; + dwt_writetxdata(send_len, tx_near_msg, 0);//将Poll包数据传给DW1000,将在开启发送时传出去 + dwt_writetxfctrl(send_len, 0);//设置超宽带发送数据长度 + dwt_starttx(DWT_START_TX_IMMEDIATE); + } + break; + case NEAR_POLL: memcpy(&tag_id_recv,&rx_buffer[TAG_ID_IDX],2); @@ -909,8 +936,8 @@ new_tagid=0; } tagofflinetime[taglist_pos]=0; - - + temp_tagpos=round((float)(sync_timer%g_com_map[COM_INTERVAL])/slottime); + tagpos_rec[(u8)temp_tagpos]=1; rec_nearbase_num=rx_buffer[NEARBASENUM_INDEX]; for(i=0;i<rec_nearbase_num;i++) @@ -928,6 +955,11 @@ seize_anchor=1; //抢占anchor Anchor_RecNearPoll(i); } + if(rec_nearbase_num>ancidlist_num) + { + ancidlist_num=rec_nearbase_num; + memcpy(ancidlist_rec,&rx_buffer[NEARBASEID_INDEX],rec_nearbase_num*2); + } break; -- Gitblit v1.9.3