#include #include "stm32f4xx_hal.h" #include "filters.h" #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 "filters.h" #include #include "beep.h" #include #include "TrackingDiff.h" #include "UDPClient.h" #include "Uart.h" #include "DBG.h" #include "CRC.h" #define DBGMSG_OUTPUT #define SENDANCPARA_LEN 102 #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 1200 #define POLL_RX_TO_RESP_TX_DLY_UUS 670 #define RESP_TX_TO_FINAL_RX_DLY_UUS 10 #define FINAL_RX_TIMEOUT_UUS 4300 #define WHITELIST1_START 0x25 #define WHITELIST1_END 0x26 #define MODBUS_ID1 0x11 #define FZ_NEARBASENUM_INDEX 10 #define FZ_NEARBASEID_INDEX 11 #define RESP_MSG_POLL_RX_TS_IDX 26 #define RESP_MSG_RESP_TX_TS_IDX 30 #define RESP_MSG_ANC_DISTOFFSET 34 #define MBX_ANC_NUM_IN_SYS 50 static uint64_t resp_tx_ts; static uint64_t final_rx_ts; static uint32_t status_reg,resp_tx_time,tagpos_binary; static uint8_t frame_len,recpoll_len,current_syncid,new_tagid,seize_anchor,result,g_start_sync_flag; static uint8_t rx_buffer[150]; static uint16_t anc_id_recv,tag_id_recv; static uint8_t flag_syncbase,sync_seq,synclost_timer,temp_nearbaspos; static uint16_t sync_timer; static uint8_t send_buffer[150]; static uint8_t frame_seq_nb2,battary,button,rec_nearbase_num,ancidlist_num; static uint16_t ancidlist_rec[TAG_NUM_IN_SYS],ancidlist_send[TAG_NUM_IN_SYS],rec_ancidlist[TAG_NUM_IN_SYS]; static int16_t rec_ancdistlist[TAG_NUM_IN_SYS]; static int16_t rec_antdelay; uint16_t taglist_num=0,taglist_pos; uint16_t tagid_list[TAG_NUM_IN_SYS]; uint8_t tagbattary_list[TAG_NUM_IN_SYS]; static uint8_t tagofflinetime[TAG_NUM_IN_SYS]; int32_t tagdist_list[TAG_NUM_IN_SYS]; static uint8_t tagpos_rec[50]; static uint64_t poll_rx_ts; static uint8_t g_flag_Taggetdist[TAG_NUM_IN_SYS],flag_tag_distsmooth[TAG_NUM_IN_SYS],misdist_num[TAG_NUM_IN_SYS]; static uint32_t poll_tx_ts, resp_rx_ts, final_tx_ts; static uint32_t poll_rx_ts_32, resp_tx_ts_32, final_rx_ts_32; static double Ra, Rb, Da, Db; static int64_t tof_dtu; static double tof; static double distance, dist_no_bias, dist_cm; extern dwt_config_t config; static double firstpath_power, rx_power,rec_firstpath_power; static double f1, f2, r1, r2; static uint16_t F1,F2,F3,N,C; const double B = 131072; const double A = 121.74; double min_power; static dwt_rxdiag_t d1; static int32_t hex_dist; extern uint16_t g_Resttimer; static int32_t filter_dist,g_Tagdist[TAG_NUM_IN_SYS]; double LOS(dwt_rxdiag_t *dia) { F1 = dia->firstPathAmp1; F2 = dia->firstPathAmp2; F3 = dia->firstPathAmp3; N = dia->rxPreamCount; C = dia->maxGrowthCIR; firstpath_power=10* log10((F1*F1+F2*F2+F3*F3)/(N*N))-A; rx_power=10*log10(C*B/(N*N))-A; // min_power = - 10 * log10((F1 *F1 + F2 * F2 + F3 * F3) / (C *B)); return min_power; } 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); } } int16_t his_dist[100]; void TagListUpdate(void) { uint16_t i,j=0,temp[TAG_NUM_IN_SYS]; for(i=0;i> (i * 8)) & 0xFF; } } extern u8 uwb_timeout; extern u16 basesystimer,uwb_losttimer; uint8_t remotesend_state,remotesend_index; uint16_t random_time; uint8_t Anchor_RecNearPoll(uint8_t ancrec_nearbasepos) //0 mainbase 1 first near_base { uint8_t motorstate; // tmp_time=TIM3->CNT; temp_nearbaspos = ancrec_nearbasepos; memcpy(&send_buffer[ANCHOR_ID_IDX],&dev_id,2); memcpy(&send_buffer[ANCTIMEMS],&basesystimer,2); // memcpy(&send_buffer[ANCTIMEUS],&tmp_time,2); send_buffer[TAGFREQ_IDX] = tag_frequency; memcpy(&send_buffer[TAG_ID_IDX],&tag_id_recv,2); poll_rx_ts = get_rx_timestamp_u64();//»ñµÃPoll°ü½ÓÊÕʱ¼äT2 if(rec_nearbase_num == ancrec_nearbasepos)//ÇÀռģʽ { // random_time = (HIDO_TimerGetTick()%100); resp_tx_time = (poll_rx_ts+((rec_nearbase_num*20 + POLL_RX_TO_RESP_TX_DLY_UUS+ancrec_nearbasepos*DELAY_BETWEEN_TWO_FRAME_UUS) * UUS_TO_DWT_TIME)) >> 8;//¼ÆËãResponse·¢ËÍʱ¼äT3¡£ }else{ resp_tx_time = (poll_rx_ts + ((rec_nearbase_num*20+POLL_RX_TO_RESP_TX_DLY_UUS+ancrec_nearbasepos*DELAY_BETWEEN_TWO_FRAME_UUS) * UUS_TO_DWT_TIME)) >> 8;//¼ÆËãResponse·¢ËÍʱ¼äT3¡£ } dwt_setdelayedtrxtime(resp_tx_time);//ÉèÖÃResponse·¢ËÍʱ¼äT3 dwt_setrxaftertxdelay(RESP_TX_TO_FINAL_RX_DLY_UUS+(rec_nearbase_num+1-ancrec_nearbasepos)*DELAY_BETWEEN_TWO_FRAME_UUS);//ÉèÖ÷¢ËÍÍê³Éºó¿ªÆô½ÓÊÕÑÓ³Ùʱ¼ä // dwt_setrxtimeout(FINAL_RX_TIMEOUT_UUS);//½ÓÊÕ³¬Ê±Ê±¼ä resp_tx_ts = (((uint64_t)(resp_tx_time & 0xFFFFFFFEUL)) << 8) ; /* Write all timestamps in the final message. See NOTE 8 below. */ resp_msg_set_ts(&send_buffer[RESP_MSG_POLL_RX_TS_IDX], poll_rx_ts); resp_msg_set_ts(&send_buffer[RESP_MSG_RESP_TX_TS_IDX], resp_tx_ts); //g_com_map[DIST_OFFSET]=0;//²âÊԼǵÃɾ memcpy(&send_buffer[RESP_MSG_ANC_DISTOFFSET],&g_com_map[DIST_OFFSET],2); // if(new_tagid) // { // tagdist_list[taglist_pos]=0x1ffff; // memcpy(&send_buffer[DIST_IDX], &tagdist_list[taglist_pos], 4); // }else{ // memcpy(&send_buffer[DIST_IDX], &tagdist_list[taglist_pos], 4); // } // motorstate =0; // if(tagdist_list[taglist_pos]5) break; }; // }else{ // result = dwt_starttx(DWT_START_TX_DELAYED | DWT_RESPONSE_EXPECTED);//ÑÓ³Ù·¢ËÍ£¬µÈ´ý½ÓÊÕ // } // if(result==0) // { // while (!((status_reg = dwt_read32bitreg(SYS_STATUS_ID)) & (SYS_STATUS_RXFCG | SYS_STATUS_ALL_RX_ERR))&&!g_start_sync_flag)///²»¶Ï²éѯоƬ״ֱ̬µ½½ÓÊճɹ¦»òÕß³öÏÖ´íÎó // { }; // }else{ // if(g_com_map[MODBUS_ID1]==1) // { // #ifdef DBGMSG_OUTPUT // printf("·¢Ëͳ¬Ê±"); // #endif // } // result++; // } // if(!(status_reg& SYS_STATUS_RXFCG)) // { // dwt_write32bitreg(SYS_STATUS_ID, SYS_STATUS_ALL_RX_ERR); // dwt_rxenable(0); // while (!((status_reg = dwt_read32bitreg(SYS_STATUS_ID)) & (SYS_STATUS_RXFCG | SYS_STATUS_ALL_RX_ERR))&&!g_start_sync_flag)///²»¶Ï²éѯоƬ״ֱ̬µ½½ÓÊճɹ¦»òÕß³öÏÖ´íÎó // { }; // } // // 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] == MBX_PRAAREPLY) // { // u16 calCRC,recCRC,rec_commap[SENDANCPARA_LEN]; // calCRC = CRC_Compute(&rx_buffer[MESSAGE_PARAREPLY_IDX],SENDANCPARA_LEN); // memcpy(&recCRC,&rx_buffer[MESSAGE_PARAREPLY_IDX+SENDANCPARA_LEN],2); // if(memcmp(&recCRC,&calCRC,2)==0) // { // uint8_t buffer_len,datalen,tempindex; // char send_buffer[200]; // memcpy(rec_commap,&rx_buffer[MESSAGE_PARAREPLY_IDX],SENDANCPARA_LEN); // pwtag[remotesend_index].remain_time = 0; // buffer_len = sprintf(send_buffer,"$replypara_anchor,"); // datalen = sprintf(&send_buffer[buffer_len],"%x,",pwtag[remotesend_index].id); // buffer_len += datalen; // for(uint16_t i=0;iCNT; // poll_rx_ts_32 = (uint32_t)poll_rx_ts;//ʹÓÃ32λÊý¾Ý¼ÆËã // resp_tx_ts_32 = (uint32_t)resp_tx_ts; // final_rx_ts_32 = (uint32_t)final_rx_ts; // Ra = (double)(resp_rx_ts - poll_tx_ts);//Tround1 = T4 - T1 // Rb = (double)(final_rx_ts_32 - resp_tx_ts_32);//Tround2 = T6 - T3 // Da = (double)(final_tx_ts - resp_rx_ts);//Treply2 = T5 - T4 // Db = (double)(resp_tx_ts_32 - poll_rx_ts_32);//Treply1 = T3 - T2 // tof_dtu = (int64_t)((Ra * Rb - Da * Db) / (Ra + Rb + Da + Db));//¼ÆË㹫ʽ // tof = tof_dtu * DWT_TIME_UNITS; // distance = tof * SPEED_OF_LIGHT;//¾àÀë=¹âËÙ*·ÉÐÐʱ¼ä //#ifdef DW3000 // dist_no_bias = distance; //#else // dist_no_bias = distance - dwt_getrangebias(config.chan, (float)distance, config.prf); //¾àÀë¼õÈ¥½ÃÕýϵÊý //#endif // dist_cm = dist_no_bias * 1000; //dis Ϊµ¥Î»ÎªcmµÄ¾àÀë //// dwt_readdiagnostics(&d1); //// LOS(&d1); // /*--------------------------ÒÔÏÂΪ·Ç²â¾àÂß¼­------------------------*/ // //dist_cm=33000; // // LED0_BLINK; //ÿ³É¹¦Ò»´ÎͨѶÔòÉÁ˸һ´Î //// UWBLED_BLINK; // uwb_losttimer = 0; // dis_after_filter=dist_cm; // hex_dist = dist_cm+(int16_t)g_com_map[DIST_OFFSET]*10; // if(recpoll_len==rec_nearbase_num*4+15) // { // hex_dist = dist_cm+(int16_t)g_com_map[DIST_OFFSET]*10-rec_antdelay*10; // } // // g_flag_Taggetdist[taglist_pos]=0; // // if(hex_dist>-100000&&hex_dist<2000000) // { // if(abs(hex_dist-his_dist[taglist_pos])<10000) // { // flag_tag_distsmooth[taglist_pos] =1; // }else{ // flag_tag_distsmooth[taglist_pos] =0; // } // if(abs(hex_dist-his_dist[taglist_pos])<10000||misdist_num[taglist_pos]>3) // { // uint16_t checksum; // g_Resttimer=0; // // IWDG_Feed(); // #ifdef TDFILTER // NewTrackingDiffUpdate(taglist_pos, (float)hex_dist); // filter_dist = pos_predict[taglist_pos]/10; // filter_speed = vel_predict[taglist_pos]/10; // newmeasure = 1; // #else // filter_dist=hex_dist/10; // #endif // misdist_num[taglist_pos]=0; // tagdist_list[taglist_pos] = filter_dist; // his_dist[taglist_pos]=hex_dist; // if(hex_dist>0) // { // g_Tagdist[taglist_pos]=hex_dist/10; // }else{ // g_Tagdist[taglist_pos]= 0x2ffff; // } // #ifdef USART_SINGLE_OUTPUT // usart_send[0]=0x55; // usart_send[1]=0xAA; // usart_send[2] = 1;//Õý³£Ä£Ê½ // usart_send[3] = 17;//Êý¾Ý¶Î³¤¶È // usart_send[4] = frame_seq_nb2;//Êý¾Ý¶Î³¤¶È // memcpy(&usart_send[5],&tag_id_recv,2); // memcpy(&usart_send[7],&dev_id,2); // if(tagdist_list[taglist_pos]<=0) // tagdist_list[taglist_pos]=0x2ffff; // memcpy(&usart_send[9],&tagdist_list[taglist_pos],4); // usart_send[13] = battary; // usart_send[14] = button; // usart_send[15] = firstpath_power; // usart_send[16] = rx_power; // checksum = Checksum_u16(&usart_send[2],17); // memcpy(&usart_send[19],&checksum,2); // //HexToAsciiSendUDP(usart_send,21); // #ifdef DBGMSG_OUTPUT // if(g_com_map[MODBUS_ID1]==1) // { // printf("²â¾à³É¹¦%d",g_Tagdist[taglist_pos]); // } // #endif // // PushAnchorDataArray(tag_id_recv,tagdist_list[taglist_pos],battary); // if(uwbled == LEDOFF ) // {uwbled = BLUE; // }else{ // uwbled = LEDOFF; // } // if(DBG_GetMode() == DBG_MODE_CFG||DBG_GetMode() == DBG_MODE_CHARGE) // { // UART_HandleTypeDef *pstUartHandle = HIDO_NULL; // Uart_GetHandle(UART_ID_DBG, (HIDO_VOID **)&pstUartHandle); // // HAL_UART_Transmit(pstUartHandle, usart_send, 21, 1000); // } // #else // memcpy(&usart_send_anc[4+6*anc_report_num],&tag_id_recv,2); // memcpy(&usart_send_anc[6+6*anc_report_num],&tagdist_list[taglist_pos],4); // anc_report_num++; // #endif // }else{ // if(g_com_map[MODBUS_ID1]==1) // { // #ifdef DBGMSG_OUTPUT // printf("²â¾à´íÎó"); // #endif // } // // // printf("%d",hex_dist); // misdist_num[taglist_pos]++; // } // } // if(remotesend_state == 1) // { // uint8_t buffer_len,datalen,tempindex; // char send_buffer[100]; // pwtag[remotesend_index].remain_time = 0; // if(pwtag[remotesend_index].index==ANCHOR_UPDATE) // { // if(pwtag[remotesend_index].value == 2) // { // StartAnchorUpdateProcess(pwtag[remotesend_index].id); // } // } // buffer_len = sprintf(send_buffer,"$confirmwrite_anchor,"); // datalen = sprintf(&send_buffer[buffer_len],"%x,1",pwtag[remotesend_index].id); // buffer_len += datalen; // send_buffer[buffer_len++] = 0x0d; // send_buffer[buffer_len++] = 0x0a; // UDPClient_Uploadhex((uint8_t*)send_buffer,buffer_len); // } // } // }else{ // if(g_com_map[MODBUS_ID1]==1) // { // #ifdef DBGMSG_OUTPUT // printf("final״̬´íÎó:%x",status_reg); // #endif // } // // //printf("%x/n",status_reg); // dwt_write32bitreg(SYS_STATUS_ID, SYS_STATUS_ALL_RX_ERR); // } // } } int16_t DistFilter(int16_t dist,int8_t pos) { if(abs(dist-his_dist[pos])<1000||misdist_num[pos]>3) { // if(tagdist_list[pos]>0&&tagdist_list[pos]<50000) // { // filter_dist=(dist/10)*0.5+0.5*tagdist_list[pos]; // }else{ // filter_dist = dist/10; // } misdist_num[pos]=0; his_dist[pos]=dist; }else{ misdist_num[pos]++; } return his_dist[pos]; } uint16_t target_tagid[12] = {0x1316,0x1394,0x1265,0x1318,0x1306,0x1304,0x1376,0x1312,0x1277,0x1388,0x1140,0x1392}; int16_t anchor_dist; void Anchor_App(void) { u8 send_len,i; u16 tempid; uint32_t rec_syncid; uint16_t checksum; // dwt_write32bitreg(SYS_STATUS_ID, SYS_STATUS_ALL_RX_ERR| SYS_STATUS_TXFRS |SYS_STATUS_RXFCG); // g_start_sync_flag=0; // dwt_setrxtimeout(0);//É趨½ÓÊÕ³¬Ê±Ê±¼ä£¬0λûÓг¬Ê±Ê±¼ä // dwt_rxenable(0);//´ò¿ª½ÓÊÕ // GPIO_WriteBit(GPIOA, GPIO_Pin_10, Bit_SET); // while (!((status_reg = dwt_read32bitreg(SYS_STATUS_ID)) & (SYS_STATUS_RXFCG | SYS_STATUS_ALL_RX_ERR)))//²»¶Ï²éѯоƬ״ֱ̬µ½½ÓÊճɹ¦»òÕß³öÏÖ´íÎó // { // IdleTask(); // }; //GPIO_WriteBit(GPIOA, GPIO_Pin_10, Bit_RESET); // delay_us(g_com_map[NEARBASE_ID2]); status_reg = dwt_read32bitreg(SYS_STATUS_ID); dwt_setinterrupt( DWT_INT_RFCG | (DWT_INT_ARFE | DWT_INT_RFSL | DWT_INT_SFDT | DWT_INT_RPHE | DWT_INT_RFCE | DWT_INT_RFTO | DWT_INT_RXPTO), 0); if (status_reg & SYS_STATUS_RXFCG)//³É¹¦½ÓÊÕ { uint16_t 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;//»ñµÃ½ÓÊÕÊý¾Ý³¤¶È recpoll_len = frame_len; dwt_readrxdata(rx_buffer, frame_len, 0);//¶ÁÈ¡½ÓÊÕÊý¾Ý memcpy(&anc_id_recv,&rx_buffer[ANCHOR_ID_IDX],2); //½«ÊÕµ½µÄtag_id·Ö±ðдÈë¸÷´ÎͨѶµÄ°üÖУ¬Îª¶à±êǩͨѶ·þÎñ£¬·ÀÖ¹Ò»´ÎͨѶÖнÓÊÕµ½²»Í¬ID±êÇ©µÄÊý¾Ý memcpy(&tag_id_recv,&rx_buffer[TAG_ID_IDX],2); if(group_id==rx_buffer[GROUP_ID_IDX]&&rx_buffer[MESSAGE_TYPE_IDX] == MBX_POLL){ frame_seq_nb2 = rx_buffer[SEQUENCE_IDX]; battary = rx_buffer[BATTARY_IDX]; //button = rx_buffer[BUTTON_IDX]; rec_nearbase_num=rx_buffer[FZ_NEARBASENUM_INDEX]; memcpy(&tag_id_recv,&rx_buffer[TAG_ID_IDX],2); memcpy(&rec_ancidlist,&rx_buffer[FZ_NEARBASEID_INDEX],2*rec_nearbase_num); memcpy(&rec_ancdistlist,&rx_buffer[FZ_NEARBASEID_INDEX+2*rec_nearbase_num],2*rec_nearbase_num); memcpy(&rec_antdelay,&rx_buffer[FZ_NEARBASEID_INDEX+rec_nearbase_num*4],2); uwb_losttimer = 0; wltag_state=RANGE; for(u8 i=0;i=TAG_NUM_IN_SYS) // break; if(taglist_pos==taglist_num) { taglist_pos=taglist_num; tagid_list[taglist_num++]=tag_id_recv; new_tagid=1; }else{ new_tagid=0; } if(rec_nearbase_num>ancidlist_num) { ancidlist_num=rec_nearbase_num; memcpy(ancidlist_rec,&rx_buffer[FZ_NEARBASEID_INDEX],rec_nearbase_num*2); } for(i=0;i