#include #include "ADC.h" #include "deca_device_api.h" #include "deca_regs.h" #include "dw_driver.h" #include "Spi.h" #include "led.h" #include "serial_at_cmd_app.h" #include "Usart.h" #include "global_param.h" #include #include #define SPEED_OF_LIGHT 299702547 #define UUS_TO_DWT_TIME 65536 #define POLL_TX_TO_RESP_RX_DLY_UUS 150 #define RESP_RX_TO_FINAL_TX_DLY_UUS 410 #define RESP_RX_TIMEOUT_UUS 2000 #define DELAY_BETWEEN_TWO_FRAME_UUS 400 #define POLL_RX_TO_RESP_TX_DLY_UUS 670 #define RESP_TX_TO_FINAL_RX_DLY_UUS 10 #define FINAL_RX_TIMEOUT_UUS 4300 static u8 tag_succ_times=0; static u16 checksum; static int8_t tag_delaytime; extern uint16_t sync_timer; static int32_t temp_dist; static u16 tagslotpos; static u8 recbase_num=0; static 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; static u8 anclost_times=0 , mainbase_lost_count=0; static u8 exsistbase_list[MAX_NEARBASE_NUM],report_num,get_newbase=0; static u8 flag_finalsend,flag_getresponse,flag_rxon; static uint16_t current_count,start_count,end_count,lastsync_timer; extern u16 bigslot_num; static u8 nearbase_num=0,last_nearbase_num,next_nearbase_num,last_slotnum, para_update,para_len; static u32 rec_tagpos_binary; static int16_t offset=4700,temptimer; static u8 rec_remotepara_state,rec_remotepara[80],neartimout_timer; static u8 frame_seq_nb; static u16 mainbase_id,true_nearbase_idlist[MAX_NEARBASE_NUM],nearbaseid_list[MAX_NEARBASE_NUM],nearbaseid_list2[MAX_NEARBASE_NUM]; static u8 FindNearBasePos(u16 baseid) { u8 i; for(i=0;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); } } u8 send_buffer[100]; #define FZ_NEARBASENUM_INDEX 10 #define FZ_NEARBASEID_INDEX 11 void FZNearPoll(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(10); //ÉèÖ÷¢ËÍºó¿ªÆô½ÓÊÕ£¬²¢É趨ÑÓ³Ùʱ¼ä 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; memcpy(&send_buffer[TAG_ID_IDX], &dev_id, 2); send_buffer[GROUP_ID_IDX] = group_id; send_buffer[BATTARY_IDX] = bat_percent; //tx_near_msg[BUTTON_IDX] = !GET_USERKEY|stationary_flag<<1; send_buffer[SEQUENCE_IDX] = frame_seq_nb++; send_buffer[FZ_NEARBASENUM_INDEX] = nearbase_num; memcpy(&send_buffer[FZ_NEARBASEID_INDEX],&nearbaseid_list,nearbase_num*2); send_buffer[MESSAGE_TYPE_IDX] = NEAR_POLL; memcpy(&send_buffer[ANCHOR_ID_IDX],&mainbase_id,2); dwt_writetxdata(35, send_buffer, 0);//½«Poll°üÊý¾Ý´«¸øDW1000£¬½«ÔÚ¿ªÆô·¢ËÍʱ´«³öÈ¥ dwt_writetxfctrl(35, 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; neartimout_timer = 0; recbase_num=0; timeout=ceil((float)nearbase_num*SLOT_SCALE)+3; current_count=HAL_LPTIM_ReadCounter(&hlptim1); end_count=start_count+(timeout<<5); if(end_count>=32768) {end_count-=32768;} while(current_countend_count+15000) { 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=end_count&¤t_countCNT=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; memcpy(&temp_dist,&rx_buffer[DIST_IDX],4); nearbase_distlist[rec_nearbasepos]=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) ;//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; tx_near_msg[GROUP_ID_IDX] = group_id; dwt_writetxdata(28+nearbase_num*4, tx_near_msg, 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(&tx_near_msg[ANCHOR_ID_IDX],&rec_nearbaseid,2); } exsistbase_list[rec_nearbasepos]=KEEP_TIMES; memcpy(&temp_dist,&rx_buffer[DIST_IDX],4); 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(&tx_near_msg[FINAL_MSG_RESP_RX_NEARBASE_IDX+(rec_nearbasepos)*4], resp_rx_ts); 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{ 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); } 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)<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;itrue_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; } } } report_num=0; for (i=0;i