From 1abba6d0da35b3a89fead56896bf82c1b9aa7831 Mon Sep 17 00:00:00 2001 From: zhyinch <zhyinch@gmail.com> Date: 星期五, 06 十一月 2020 15:26:49 +0800 Subject: [PATCH] V2.9 修改静止判定时间 修改静止阈值 --- Src/application/dw_app.c | 760 +++++++++++++++++++++++++++++++++++++++++++--------------- 1 files changed, 562 insertions(+), 198 deletions(-) diff --git a/Src/application/dw_app.c b/Src/application/dw_app.c index 77b7804..7644350 100644 --- a/Src/application/dw_app.c +++ b/Src/application/dw_app.c @@ -44,17 +44,17 @@ /* Delay between frames, in UWB microseconds. See NOTE 4 below. */ /* This is the delay from the end of the frame transmission to the enable of the receiver, as programmed for the DW1000's wait for response feature. */ -#define POLL_TX_TO_RESP_RX_DLY_UUS 150 +#define POLL_TX_TO_RESP_RX_DLY_UUS 10 /* This is the delay from Frame RX timestamp to TX reply timestamp used for calculating/setting the DW1000's delayed TX function. This includes the * frame length of approximately 2.66 ms with above configuration. */ -#define RESP_RX_TO_FINAL_TX_DLY_UUS 410 +#define RESP_RX_TO_FINAL_TX_DLY_UUS 510 /* Receive response timeout. See NOTE 5 below. */ -#define RESP_RX_TIMEOUT_UUS 600 +#define RESP_RX_TIMEOUT_UUS 1000 -#define DELAY_BETWEEN_TWO_FRAME_UUS 400 +#define DELAY_BETWEEN_TWO_FRAME_UUS 240 -#define POLL_RX_TO_RESP_TX_DLY_UUS 420 +#define POLL_RX_TO_RESP_TX_DLY_UUS 470 /* This is the delay from the end of the frame transmission to the enable of the receiver, as programmed for the DW1000's wait for response feature. */ #define RESP_TX_TO_FINAL_RX_DLY_UUS 200 /* Receive final timeout. See NOTE 5 below. */ @@ -69,21 +69,22 @@ #define FINAL_MSG_FINAL_TX_TS_IDX 18 #define FINAL_MSG_TS_LEN 4 - +#define STARTPOLL REGPOLL enum enumtagstate { + REGPOLL, DISCPOLL, GETNEARMSG, NEARPOLL, -}tag_state=GETNEARMSG; +}tag_state=STARTPOLL; static dwt_config_t config = { 2, /* 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. */ - 0, /* Use non-standard SFD (Boolean) */ + 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. */ @@ -92,7 +93,7 @@ static uint8_t tx_sync_msg[14] = {0}; static uint8_t tx_final_msg[60] = {0}; static uint8_t tx_resp_msg[22] = {0}; -static uint8_t tx_near_msg[80] = {0}; + uint8_t tx_near_msg[80] = {0}; static uint32_t frame_seq_nb = 0; static uint32_t status_reg = 0; @@ -196,6 +197,10 @@ tx_final_msg[MESSAGE_TYPE_IDX]=FINAL; tx_sync_msg[MESSAGE_TYPE_IDX]=SYNC; + memcpy(&tx_poll_msg[GROUP_ID_IDX], &group_id, 1); + memcpy(&tx_final_msg[GROUP_ID_IDX], &group_id, 1); + memcpy(&tx_resp_msg[GROUP_ID_IDX], &group_id, 1); + memcpy(&tx_poll_msg[TAG_ID_IDX], &dev_id, 2); memcpy(&tx_final_msg[TAG_ID_IDX], &dev_id, 2); memcpy(&tx_resp_msg[ANCHOR_ID_IDX], &dev_id, 2); @@ -266,7 +271,7 @@ u8 GetRandomSlotPos(uint32_t emptyslot) { u8 i,temp_value; - temp_value = GetRandomValue(); + temp_value = HAL_LPTIM_ReadCounter(&hlptim1);//GetRandomValue(); for(i=temp_value%32;i<max_slotpos;i++) { if(((emptyslot>>i)&0x1)==0) @@ -284,55 +289,395 @@ } return max_slotpos-1; } +void MODBUS_Poll(void) +{ + uint32_t frame_len; + uint32_t final_tx_time; + u32 start_poll; + u8 i,getsync_flag=0; + u8 bat_percent; + //LED0_ON; + //dwt_forcetrxoff(); + g_Resttimer=0; + dwt_setrxaftertxdelay(POLL_TX_TO_RESP_RX_DLY_UUS); //设置发送后开启接收,并设定延迟时间 + dwt_setrxtimeout(RESP_RX_TIMEOUT_UUS); + tag_succ_times = 0; + if(bat_percent>100) + bat_percent=100; + tx_poll_msg[BATTARY_IDX] = bat_percent;//Get_Battary(); +// tx_poll_msg[BUTTON_IDX] = !READ_KEY0; + tx_poll_msg[SEQUENCE_IDX] = frame_seq_nb++; +// GPIO_WriteBit(GPIOA, GPIO_Pin_9, Bit_RESET); + for(i=0;i<g_com_map[MAX_REPORT_ANC_NUM];i++) + { + /* Write frame data to DW1000 and prepare transmission. See NOTE 7 below. */ + tx_poll_msg[ANC_TYPE_IDX] = i; + + dwt_writetxdata(sizeof(tx_poll_msg), tx_poll_msg, 0);//将Poll包数据传给DW1000,将在开启发送时传出去 + dwt_writetxfctrl(sizeof(tx_poll_msg), 0);//设置超宽带发送数据长度 + + /* Start transmission, indicating that a response is expected so that reception is enabled automatically after the frame is sent and the delay + * set by dwt_setrxaftertxdelay() has elapsed. */ + dwt_starttx(DWT_START_TX_IMMEDIATE | DWT_RESPONSE_EXPECTED);//开启发送,发送完成后等待一段时间开启接收,等待时间在dwt_setrxaftertxdelay中设置 +// 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)))//不断查询芯片状态直到成功接收或者发生错误 + { + IdleTask(); + + }; + + /* Increment frame sequence number after transmission of the poll message (modulo 256). */ + if(status_reg==0xffffffff) + { + NVIC_SystemReset(); + } + + if (status_reg & SYS_STATUS_RXFCG)//如果成功接收 + { + /* Clear good RX frame event and TX frame sent in the DW1000 status register. */ + dwt_write32bitreg(SYS_STATUS_ID, SYS_STATUS_RXFCG | SYS_STATUS_TXFRS);//清楚寄存器标志位 + + /* A frame has been received, read it into the local buffer. */ + frame_len = dwt_read32bitreg(RX_FINFO_ID) & RX_FINFO_RXFLEN_MASK; //获得接收到的数据长度 + + dwt_readrxdata(rx_buffer, frame_len, 0); //读取接收数据 + + + /* Check that the frame is the expected response from the companion "DS TWR responder" example. + * As the sequence number field of the frame is not relevant, it is cleared to simplify the validation of the frame. */ + + if (rx_buffer[GROUP_ID_IDX] == group_id&&rx_buffer[MESSAGE_TYPE_IDX] == RESPONSE&&!memcmp(&rx_buffer[TAG_ID_IDX],&dev_id,4)) //判断接收到的数据是否是response数据 + { u16 anc_id_recv,rec_com_interval; + /* Retrieve poll transmission and response reception timestamp. */ + poll_tx_ts = get_tx_timestamp_u64(); //获得POLL发送时间T1 + resp_rx_ts = get_rx_timestamp_u64(); //获得RESPONSE接收时间T4 + + if(getsync_flag==0&&g_com_map[DEV_ROLE]) + { + getsync_flag=1; + memcpy(&sync_timer,&rx_buffer[ANCTIMEMS],2); + memcpy(&tmp_time,&rx_buffer[ANCTIMEUS],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; + } + // memcpy(&hex_dist2, &rx_buffer[DIST_IDX], 4); + memcpy(&tx_final_msg[ANCHOR_ID_IDX], &rx_buffer[ANCHOR_ID_IDX], 4); + // memcpy(&rec_com_interval,&rx_buffer[ANCSEND_INTERVAL], 2); +// if(rec_com_interval>4&&rec_com_interval!=g_com_map[COM_INTERVAL]) +// { +// g_com_map[COM_INTERVAL]=rec_com_interval; +// save_com_map_to_flash(); +// // delay_ms(100); +// SCB->AIRCR = 0X05FA0000|(unsigned int)0x04; //软复位回到bootloader +// } + + /* Compute final message transmission time. See NOTE 9 below. */ + final_tx_time = (resp_rx_ts + (RESP_RX_TO_FINAL_TX_DLY_UUS * UUS_TO_DWT_TIME)) >> 8;//计算final包发送时间,T5=T4+Treply2 + dwt_setdelayedtrxtime(final_tx_time);//设置final包发送时间T5 + + /* Final TX timestamp is the transmission time we programmed plus the TX antenna delay. */ + final_tx_ts = (((uint64_t)(final_tx_time & 0xFFFFFFFE)) << 8) + TX_ANT_DLY;//final包实际发送时间是计算时间加上发送天线delay + + /* Write all timestamps in the final message. See NOTE 10 below. */ + final_msg_set_ts(&tx_final_msg[FINAL_MSG_POLL_TX_TS_IDX], poll_tx_ts);//将T1,T4,T5写入发送数据 + final_msg_set_ts(&tx_final_msg[FINAL_MSG_RESP_RX_TS_IDX], resp_rx_ts); + final_msg_set_ts(&tx_final_msg[FINAL_MSG_FINAL_TX_TS_IDX], final_tx_ts); + + /* Write and send final message. See NOTE 7 below. */ + + dwt_writetxdata(sizeof(tx_final_msg), tx_final_msg, 0);//将发送数据写入DW1000 + dwt_writetxfctrl(sizeof(tx_final_msg), 0);//设定发送数据长度 + result=dwt_starttx(DWT_START_TX_DELAYED);//设定为延迟发送 + + tag_succ_times++; + + LED0_BLINK; + + memcpy(&anc_id_recv,&rx_buffer[ANCHOR_ID_IDX],2); +// if(hex_dist2!=0xffff) +// { +// g_Tagdist[anc_id_recv]= hex_dist2; +// g_flag_Taggetdist[anc_id_recv]=0; +// +// if(!g_com_map[MODBUS_MODE]) +// { +// hex_dist2 = hex_dist2; +// usart_send[2] = 1;//正常模式 +// usart_send[3] = 17;//数据段长度 +// usart_send[4] = frame_seq_nb;//数据段长度 +// memcpy(&usart_send[5],&dev_id,2); +// memcpy(&usart_send[7],&rx_buffer[ANCHOR_ID_IDX],2); +// +// memcpy(&usart_send[9],&hex_dist2,4); +// usart_send[13] = bat_percent; +// usart_send[14] = button; +// checksum = Checksum_u16(&usart_send[2],17); +// memcpy(&usart_send[19],&checksum,2); +// UART_PushFrame(usart_send,21); +// } +// } + // memcpy(&Modbus_HoldReg[anc_id_recv*2],&hex_dist,4); + /* Poll DW1000 until TX frame sent event set. See NOTE 8 below. */ + if(result==0) + {while (!(dwt_read32bitreg(SYS_STATUS_ID) & SYS_STATUS_TXFRS))//不断查询芯片状态直到发送完成 + { }; + } + /* Clear TXFRS event. */ + dwt_write32bitreg(SYS_STATUS_ID, SYS_STATUS_TXFRS);//清除标志位 + + /* Increment frame sequence number after transmission of the final message (modulo 256). */ + + random_delay_tim = 0; + } + else + { + random_delay_tim = DFT_RAND_DLY_TIM_MS; //如果通讯失败,将间隔时间增加5ms,避开因为多标签同时发送引起的冲突。 + } + } + else + { + /* Clear RX error events in the DW1000 status register. */ + dwt_write32bitreg(SYS_STATUS_ID, SYS_STATUS_ALL_RX_ERR); + random_delay_tim = DFT_RAND_DLY_TIM_MS; + } +// deca_sleep(10); +} +// dwt_entersleep(); + + + /* Execute a delay between ranging exchanges. */ + 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; 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; uint16_t current_count,start_count,end_count,lastsync_timer; - -u8 nearbase_num=0,last_nearbase_num,next_nearbase_num,last_slotnum; +extern u16 bigslot_num; +u8 nearbase_num=0,last_nearbase_num,next_nearbase_num,last_slotnum, para_update,para_len,stationary_flag=0; u32 rec_tagpos_binary; -int16_t offset=2700; -u8 motor_state,rec_remotepara_state,rec_remotepara[30]; +int16_t offset=4700,temptimer; +u8 motor_state,rec_remotepara_state,rec_remotepara[80]; +void Poll(void) +{ + uint32_t frame_len; + uint32_t final_tx_time; + u32 start_poll; + int32_t mindist=999999,minid=-1,temp_dist; + u8 i,getsync_flag=0; + dwt_setrxaftertxdelay(POLL_TX_TO_RESP_RX_DLY_UUS); //设置发送后开启接收,并设定延迟时间 + dwt_setrxtimeout(RESP_RX_TIMEOUT_UUS); + tag_succ_times = 0; + + for(i=0;i<3;i++) + { + /* Write frame data to DW1000 and prepare transmission. See NOTE 7 below. */ + tx_poll_msg[ANC_TYPE_IDX] = i; + dwt_writetxdata(sizeof(tx_poll_msg), tx_poll_msg, 0);//将Poll包数据传给DW1000,将在开启发送时传出去 + dwt_writetxfctrl(sizeof(tx_poll_msg), 0);//设置超宽带发送数据长度 + dwt_starttx(DWT_START_TX_IMMEDIATE | DWT_RESPONSE_EXPECTED);//开启发送,发送完成后等待一段时间开启接收,等待时间在dwt_setrxaftertxdelay中设置 + + /* 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(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] == RESPONSE&&!memcmp(&rx_buffer[TAG_ID_IDX],&dev_id,2)) //判断接收到的数据是否是response数据 + { + poll_tx_ts = get_tx_timestamp_u64(); //获得POLL发送时间T1 + resp_rx_ts = get_rx_timestamp_u64(); //获得RESPONSE接收时间T4 + if(getsync_flag==0) + { + getsync_flag=1; + 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;} + } + } + + memcpy(&temp_dist, &rx_buffer[DIST_IDX], 4); + memcpy(&tx_final_msg[ANCHOR_ID_IDX], &rx_buffer[ANCHOR_ID_IDX], 4); + /* Compute final message transmission time. See NOTE 9 below. */ + final_tx_time = (resp_rx_ts + (RESP_RX_TO_FINAL_TX_DLY_UUS * UUS_TO_DWT_TIME)) >> 8;//计算final包发送时间,T5=T4+Treply2 + 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(&tx_final_msg[FINAL_MSG_POLL_TX_TS_IDX], poll_tx_ts);//将T1,T4,T5写入发送数据 + final_msg_set_ts(&tx_final_msg[FINAL_MSG_RESP_RX_TS_IDX], resp_rx_ts); + final_msg_set_ts(&tx_final_msg[FINAL_MSG_FINAL_TX_TS_IDX], final_tx_ts); + dwt_writetxdata(sizeof(tx_final_msg), tx_final_msg, 0);//将发送数据写入DW1000 + dwt_writetxfctrl(sizeof(tx_final_msg), 0);//设定发送数据长度 + result=dwt_starttx(DWT_START_TX_DELAYED);//设定为延迟发送 + tag_succ_times++; + LED0_BLINK; + + ancsync_time=((sync_timer)*1000+tmp_time); + last_slotnum=current_slotnum; + temptimer = sync_timer-10; + if(temptimer<0) + {temptimer+=1000;} + current_slotnum=((float)temptimer/(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); + + if(temp_dist<mindist&&temp_dist!=0) + { + memcpy(&minid, &rx_buffer[ANCHOR_ID_IDX], 4); + tag_state=GETNEARMSG; + trygetnearmsg_times=5; + mindist=temp_dist; + } + if(result==0) + {while (!(dwt_read32bitreg(SYS_STATUS_ID) & SYS_STATUS_TXFRS))//不断查询芯片状态直到发送完成 + { }; + } + /* Clear TXFRS event. */ + dwt_write32bitreg(SYS_STATUS_ID, SYS_STATUS_TXFRS);//清除标志位 + random_delay_tim = 0; + } + else + { + random_delay_tim = DFT_RAND_DLY_TIM_MS; //如果通讯失败,将间隔时间增加5ms,避开因为多标签同时发送引起的冲突。 + } + } + else + { + dwt_write32bitreg(SYS_STATUS_ID, SYS_STATUS_ALL_RX_ERR); + random_delay_tim = DFT_RAND_DLY_TIM_MS; + } +} + if(getsync_flag==0) + { + tagslotpos--; + if(tagslotpos==0||tagslotpos>max_slotpos) + { + tagslotpos=max_slotpos; + } + tyncpoll_time=(tagslotpos-1)*slottime; + } + mainbase_id=minid; + //mainbase_id = 0x1; +} +u8 nearmsg_mainbase=0,rec_tagpos_emptylist[32],mainbase_type;; +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); + + /* 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(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]; + memcpy(&rec_tagpos_binary,&rx_buffer[NEARMSG_EMPTYSLOTPOS_INDEX],4); + // 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; + 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) { uint32_t temp1,temp2,dw_systime; - uint32_t frame_len; + uint32_t final_tx_time; u32 start_poll; u8 i,j,getsync_flag=0,timeout; dwt_setrxaftertxdelay(POLL_TX_TO_RESP_RX_DLY_UUS); //设置发送后开启接收,并设定延迟时间 dwt_setrxtimeout(RESP_RX_TIMEOUT_UUS); 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; } 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; - tx_near_msg[BATTARY_IDX] = Get_Battary(); - //tx_near_msg[BUTTON_IDX] = !READ_KEY0; + tx_near_msg[BATTARY_IDX] = bat_percent; + 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(13+2*nearbase_num, tx_near_msg, 0);//将Poll包数据传给DW1000,将在开启发送时传出去 - dwt_writetxfctrl(13+2*nearbase_num, 0);//设置超宽带发送数据长度 + dwt_writetxdata(21+2*nearbase_num, tx_near_msg, 0);//将Poll包数据传给DW1000,将在开启发送时传出去 + dwt_writetxfctrl(21+2*nearbase_num, 0);//设置超宽带发送数据长度 dwt_starttx(DWT_START_TX_IMMEDIATE | DWT_RESPONSE_EXPECTED);//开启发送,发送完成后等待一段时间开启接收,等待时间在dwt_setrxaftertxdelay中设置 + tx_near_msg[TAGCONFIGSUCCESS_INDEX] =0; + para_update = 0; flag_finalsend=0; flag_rxon=1; flag_getresponse=0; start_count=HAL_LPTIM_ReadCounter(&hlptim1); recbase_num=0; - timeout=ceil((float)nearbase_num*0.6)+2; + timeout=ceil((float)nearbase_num*SLOT_SCALE)+2; end_count=start_count+(timeout<<5); if(end_count>=32768) {end_count-=32768;} @@ -344,20 +689,6 @@ current_count=HAL_LPTIM_ReadCounter(&hlptim1); while (!((status_reg = dwt_read32bitreg(SYS_STATUS_ID)) & (SYS_STATUS_RXFCG | SYS_STATUS_ALL_RX_ERR)))//不断查询芯片状态直到成功接收或者发生错误 { - if(flag_finalsend) - { - dw_systime=dwt_readsystimestamphi32(); - if(dw_systime>temp1&&dw_systime<temp2) - { - - dwt_forcetrxoff(); - flag_rxon=0; - dwt_setdelayedtrxtime(final_tx_time); - result=dwt_starttx(DWT_START_TX_DELAYED);//设定为延迟发送 - flag_finalsend=0; - break; - } - } current_count=HAL_LPTIM_ReadCounter(&hlptim1); if(current_count>=end_count&¤t_count<end_count+15000) break; @@ -369,24 +700,18 @@ if (status_reg & SYS_STATUS_RXFCG)//如果成功接收 { dwt_write32bitreg(SYS_STATUS_ID, SYS_STATUS_RXFCG | SYS_STATUS_TXFRS);//清楚寄存器标志位 + dwt_setrxtimeout(RESP_RX_TIMEOUT_UUS);//设定接收超时时间,0位没有超时时间 + dwt_rxenable(0);//打开接收 frame_len = dwt_read32bitreg(RX_FINFO_ID) & RX_FINFO_RXFLEN_MASK; //获得接收到的数据长度 dwt_readrxdata(rx_buffer, frame_len, 0); //读取接收数据 - dwt_setrxtimeout(0);//DELAY_BETWEEN_TWO_FRAME_UUS*(nearbase_num+1-recbase_num)+10);//设定接收超时时间,0位没有超时时间 - dwt_rxenable(0);//打开接收 + if (rx_buffer[MESSAGE_TYPE_IDX] == NEAR_RESPONSE&&!memcmp(&rx_buffer[TAG_ID_IDX],&dev_id,2)) //判断接收到的数据是否是response数据 { u16 rec_nearbaseid,rec_nearbasepos; poll_tx_ts = get_tx_timestamp_u64(); //获得POLL发送时间T1 resp_rx_ts = get_rx_timestamp_u64(); //获得RESPONSE接收时间T4 recbase_num++; memcpy(&rec_nearbaseid,&rx_buffer[ANCHOR_ID_IDX],2); - if(last_nearbase_num==0) - { - get_newbase=1; - nearbaseid_list[0]=rec_nearbaseid; - nearbase_num=1; - memcpy(&tx_near_msg[ANCHOR_ID_IDX],&rec_nearbaseid,2); - } - if(rec_nearbaseid==nearbaseid_list[0]) + if(rec_nearbaseid==mainbase_id) { //////////////////////////////////时间同步 memcpy(&sync_timer,&rx_buffer[ANCTIMEMS],2); @@ -406,128 +731,88 @@ // tagslotpos=tagslotpos%(max_slotpos+1); // tyncpoll_time=(tagslotpos-1)*slottime; //////////////////////////// - rec_nearbasepos=0; - exsistbase_list[rec_nearbasepos]=KEEP_TIMES; + memcpy(&temp_dist,&rx_buffer[DIST_IDX],4); - nearbase_distlist[rec_nearbasepos]=temp_dist; - motor_state=rx_buffer[MOTORSTATE_INDEX]&0xf; + mainbase_dist=temp_dist; + if((rx_buffer[MOTORSTATE_INDEX]&0xf)!=3) + motor_state=rx_buffer[MOTORSTATE_INDEX]&0xf; rec_remotepara_state=rx_buffer[MOTORSTATE_INDEX]>>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(&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], 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);//设定发送数据长度 + + if(rec_remotepara_state&&!memcmp(&rx_buffer[TAG_ID_IDX],&dev_id,2)) + { + para_update = 1; + tx_near_msg[TAGCONFIGSUCCESS_INDEX] = 1; + 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); - - tyncpoll_time=0; + final_msg_set_ts(&tx_near_msg[FINAL_MSG_RESP_RX_NEARBASE_IDX], resp_rx_ts); + //时间同步 ancsync_time=((sync_timer)*1000+tmp_time); last_slotnum=current_slotnum; - current_slotnum=round((float)sync_timer/g_com_map[COM_INTERVAL])+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(tyncpoll_time); - if(rec_remotepara_state&&rec_remotepara_state!=g_com_map[REMOTEPARA_STATE]) - { - g_com_map[REMOTEPARA_STATE]=rec_remotepara_state; - 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); - save_com_map_to_flash(); - delay_ms(100); - NVIC_SystemReset(); - - } - - // count_offset=sync_count-current_count-143; - // current_slottimes=(ancsync_time-10000)/(g_com_map[COM_INTERVAL]*1000); - // nextpoll_delaytime=tyncpoll_time*1000+g_com_map[COM_INTERVAL]*1000-((ancsync_time)%(g_com_map[COM_INTERVAL]*1000))-4300; -// if(abs(ancsync_time-910000)<1000) -// { -// nextpoll_delaytime+=10000; -// } -// if(nextpoll_delaytime<2000) -// { -// nextpoll_delaytime+=g_com_map[COM_INTERVAL]*1000; -// } -// lastpoll_count= current_count+(nextpoll_delaytime)/LPTIMER_LSB; -// if(lastpoll_count>LPTIMER_1S_COUNT) -// lastpoll_count-=LPTIMER_1S_COUNT; -// __HAL_LPTIM_COMPARE_SET(&hlptim1, lastpoll_count); - ///////////////////////////////////////// -// dwt_setdelayedtrxtime(final_tx_time); -// result=dwt_starttx(DWT_START_TX_DELAYED);//设定为延迟发送 + SetNextPollTime(tagslotpos); + }else{ - rec_nearbasepos=FindNearBasePos(rec_nearbaseid); - if(rec_nearbasepos>=last_nearbase_num) //发现新的基站 - { - get_newbase=1; - nearbase_num++; - nearbaseid_list[rec_nearbasepos] = rec_nearbaseid; - memcpy(&tx_near_msg[ANCHOR_ID_IDX],&rec_nearbaseid,2); - } - + rec_nearbasepos=FindNearBasePos(rec_nearbaseid); exsistbase_list[rec_nearbasepos]=KEEP_TIMES; memcpy(&temp_dist,&rx_buffer[DIST_IDX],4); - nearbase_distlist[rec_nearbasepos]=temp_dist; + 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写入发送数据 - if(motor_state<rx_buffer[MOTORSTATE_INDEX]&&rx_buffer[MOTORSTATE_INDEX]!=3) - { - motor_state=rx_buffer[MOTORSTATE_INDEX]; - } - - final_msg_set_ts(&tx_near_msg[FINAL_MSG_RESP_RX_NEARBASE_IDX+(rec_nearbasepos)*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; + if(result==0) + {while (!(dwt_read32bitreg(SYS_STATUS_ID) & SYS_STATUS_TXFRS))//不断查询芯片状态直到发送完成 + { };} + break; + } - - - //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{ dwt_write32bitreg(SYS_STATUS_ID,SYS_STATUS_RXFCG| SYS_STATUS_ALL_RX_ERR); - if(flag_rxon) - {dwt_rxenable(0); - } + if(recbase_num!=nearbase_num+1) + {dwt_rxenable(0); } + // if(flag_rxon) +// { + // dwt_rxenable(0); +// } } // 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); - nearbase_num=recbase_num; j=0; if(exsistbase_list[0]==0) { -// u8 temp_adc,random_value; -// random_value=0; -// for(i=0;i<8;i++) -// { -// temp_adc=Get_ADC_Value(); -// random_value=random_value|((temp_adc&0x01)<<i); -// } - tagslotpos=GetRandomSlotPos(rec_tagpos_binary); - tyncpoll_time = (tagslotpos--%max_slotpos)*slottime; - // SetNextPollTime(tyncpoll_time); +// SetNextPollTime(tagslotpos); } // tyncpoll_time=0; next_nearbase_num=0; - for(i=0;i<last_nearbase_num+get_newbase;i++) + for(i=0;i<nearbase_num;i++) { if(exsistbase_list[i]>0) { @@ -562,97 +847,176 @@ } } } - - report_num=0; - for (i=0;i<last_nearbase_num;i++) + if(true_nearbase_distlist[0]<mainbase_dist-THRESHOLD_CHANGE_MAINBASE_DIST&&true_exsistbase_list[0]) { - nearbaseid_list[i]=true_nearbase_idlist[i]; - nearbase_distlist[i]=true_nearbase_distlist[i]; - if(nearbase_distlist[i]!=0x1ffff&&true_exsistbase_list[i]==0xa) - { - memcpy(&usart_send[4+6*report_num],&nearbaseid_list[i],2); - memcpy(&usart_send[6+6*report_num],&nearbase_distlist[i],4); - report_num++; - } + 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++) +// { +// nearbaseid_list[i]=true_nearbase_idlist[i]; +// nearbase_distlist[i]=true_nearbase_distlist[i]; +// if(nearbase_distlist[i]!=0x1ffff&&true_exsistbase_list[i]==0xa) +// { +// memcpy(&usart_send[4+6*report_num],&nearbaseid_list[i],2); +// memcpy(&usart_send[6+6*report_num],&nearbase_distlist[i],4); +// report_num++; +// } +// } 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; + pack_msgtype = rec_remotepara[0]; + pack_index = rec_remotepara[1]; + pack_length = rec_remotepara[2]; + if(pack_msgtype==2) + { + memcpy((uint8_t*)&g_com_map + pack_index, &rec_remotepara[3], pack_length); + //返回一个error状态 + //SendComMap(pack_datalen,pack_index); + save_com_map_to_flash(); + delay_ms(100); + NVIC_SystemReset(); + } + } 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); } -u8 nearmsg_mainbase=0,rec_tagpos_emptylist[32]; -void GetNearMsg(void) +extern uint8_t module_power,imu_enable,motor_enable; + +void Registor_Poll(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); - - /* 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(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数据 + static u8 regpoll_count=0; + tag_frequency = REGISTER_FREQUENCY; + bigslot_num = TOTAL_SLOTNUM/tag_frequency; + regpoll_count++; + if(regpoll_count%2) { - nearbase_num=rx_buffer[NEARBASENUM_INDEX]; - memcpy(&rec_tagpos_binary,&rx_buffer[NEARMSG_EMPTYSLOTPOS_INDEX],4); - 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; - tag_state=NEARPOLL; + if(tagslotpos--<2) + tagslotpos=TOTAL_SLOTNUM; } - }else{ - tyncpoll_time = (tagslotpos--%max_slotpos)*slottime; - } -} + SetNextPollTime(tagslotpos); + dwt_setrxaftertxdelay(POLL_TX_TO_RESP_RX_DLY_UUS); //设置发送后开启接收,并设定延迟时间 + dwt_setrxtimeout(RESP_RX_TIMEOUT_UUS); + tx_near_msg[REGP_TAGSTATE_INDEX] = !GET_USERKEY<<2|imu_enable<<1|motor_enable; + tx_near_msg[MESSAGE_TYPE_IDX] = REG_POLL; + tx_near_msg[REGP_FREQUENCY_INDEX] = 1000/g_com_map[COM_INTERVAL]; + 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[IMU_THRES],2); + memcpy(&tx_near_msg[REGP_NOMOVESLEEPTIME_INDEX],&g_com_map[NOMOVESLEEP_TIME],2); + dwt_writetxdata(21, tx_near_msg, 0);//将Poll包数据传给DW1000,将在开启发送时传出去 + dwt_writetxfctrl(21, 0);//设置超宽带发送数据长度 + dwt_starttx(DWT_START_TX_IMMEDIATE | DWT_RESPONSE_EXPECTED);//开启发送,发送完成后等待一段时间开启接收,等待时间在dwt_setrxaftertxdelay中设置 + while (!((status_reg = dwt_read32bitreg(SYS_STATUS_ID)) & (SYS_STATUS_RXFCG | SYS_STATUS_ALL_RX_ERR)))//不断查询芯片状态直到成功接收或者发生错误 + { + IdleTask(); + + }; + 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] == REG_RESPONSE&&!memcmp(&rx_buffer[TAG_ID_IDX],&dev_id,2)) //判断接收到的数据是否是response数据 + { u16 rec_nearbaseid,rec_nearbasepos; + + memcpy(&rec_nearbaseid,&rx_buffer[ANCHOR_ID_IDX],2); + tag_frequency = rx_buffer[REGR_TAGFREQ_INDEX]; + bigslot_num = TOTAL_SLOTNUM/tag_frequency; + tagslotpos = rx_buffer[REGR_TAGSLOTPOS_INDEX]; + //////////////////////////////////时间同步 + 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;} + } + ancsync_time=((sync_timer)*1000+tmp_time); + last_slotnum=current_slotnum; + temptimer = sync_timer-10; + if(temptimer<0) + {temptimer+=1000;} + current_slotnum=((float)temptimer/(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); + mainbase_id=rec_nearbaseid; + nearbase_num=rx_buffer[NEARBASENUM_INDEX]; + memcpy(nearbaseid_list,&rx_buffer[NEARBASEID_INDEX],nearbase_num*2); + tag_state = NEARPOLL; + } + } +} +u32 id; void Tag_App(void)//发送模式(TAG标签) { - u32 id; + //LED0_ON; id = dwt_readdevid() ; while (DWT_DEVICE_ID != id) { id = dwt_readdevid() ; } - - g_Resttimer=0; -// tag_state=DISCPOLL; switch(tag_state) { + case REGPOLL: + LED_LG_ON; + Registor_Poll(); + LED_LG_OFF; + break; case DISCPOLL: - // Poll(); + LED_LG_ON; + Poll(); + LED_LG_OFF; break; case GETNEARMSG: - - GetNearMsg(); - + trygetnearmsg_times--; + LED_LG_ON; + GetNearMsg(); + LED_LG_OFF; + if(trygetnearmsg_times==0) + { + tag_state = DISCPOLL; + } break; case NEARPOLL: //GPIO_WriteBit(EU_TX_GPIO, EU_RX_PIN, Bit_SET); -- Gitblit v1.9.3