From 5b8bde9ae08b29e4ce6d04149fe0cb78e0c5d68c Mon Sep 17 00:00:00 2001 From: WXK <287788329@qq.com> Date: 星期日, 24 三月 2024 13:48:14 +0800 Subject: [PATCH] 1.12,加入lora'升级标签。 --- Src/application/dw_ancapp.c | 418 ++++++++++++++++++++++++++++++++--------------------------- 1 files changed, 225 insertions(+), 193 deletions(-) diff --git a/Src/application/dw_ancapp.c b/Src/application/dw_ancapp.c index d76d691..da3d62e 100644 --- a/Src/application/dw_ancapp.c +++ b/Src/application/dw_ancapp.c @@ -52,7 +52,8 @@ 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,ancidlist_num; +static uint8_t battary,button,ancidlist_num; +uint8_t frame_seq_nb2; uint8_t rec_nearbase_num; static uint16_t ancidlist_rec[TAG_NUM_IN_SYS],ancidlist_send[TAG_NUM_IN_SYS],rec_ancidlist[TAG_NUM_IN_SYS],rec_ancdistlist[TAG_NUM_IN_SYS]; static int16_t rec_antdelay; @@ -82,18 +83,18 @@ 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; - + 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)); +// 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]; @@ -143,26 +144,26 @@ } void TagListUpdate(void) { - uint16_t i,j=0,temp[TAG_NUM_IN_SYS]; - for(i=0;i<taglist_num;i++) - { - if(tagofflinetime[i]++<QUIT_SLOT_TIME) - { - tagid_list[j]=tagid_list[i]; - tagofflinetime[j++]=tagofflinetime[i]; - } - } - taglist_num=j; + uint16_t i,j=0,temp[TAG_NUM_IN_SYS]; + for(i=0; i<taglist_num; i++) + { + if(tagofflinetime[i]++<QUIT_SLOT_TIME) + { + tagid_list[j]=tagid_list[i]; + tagofflinetime[j++]=tagofflinetime[i]; + } + } + taglist_num=j; } uint16_t CmpTagInList(uint16_t tagid) -{uint16_t i; - for(i=0;i<taglist_num;i++) - { - if(memcmp(&tagid,&tagid_list[i],2)==0) - break; - } +{ uint16_t i; + for(i=0; i<taglist_num; i++) + { + if(memcmp(&tagid,&tagid_list[i],2)==0) + break; + } tagofflinetime[i] = 0; - return i; + return i; } static void resp_msg_set_ts(uint8_t *ts_field, const uint64_t ts) { @@ -179,48 +180,49 @@ u16 basesystimer,uwb_losttimer; uint8_t remotesend_state,remotesend_index; uint16_t random_time; +u32 value; 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); + 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 + 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 = (GetLPTime()%100); - resp_tx_time = (poll_rx_ts+((random_time+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。 + resp_tx_time = (poll_rx_ts+((/*value+*/random_time+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 + ((/*value+ */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) ; + 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); - memcpy(&send_buffer[RESP_MSG_ANC_DISTOFFSET],&g_com_map[DIST_OFFSET],2); + /* 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); + memcpy(&send_buffer[RESP_MSG_ANC_DISTOFFSET],&g_com_map[DIST_OFFSET],2); - send_buffer[GROUP_ID_IDX] = group_id; + send_buffer[GROUP_ID_IDX] = group_id; // send_buffer[MAINBASE_INDEX]=flag_syncbase; - send_buffer[MESSAGE_TYPE_IDX]=MBX_RESPONSE; - send_buffer[MOTORSTATE_INDEX]=motorstate;//(remotesend_state<<4)|motorstate; - send_buffer[MOTORSTATE_INDEX]&=0x0f; - remotesend_state = 0; - - dwt_forcetrxoff(); - dwt_writetxdata(38, send_buffer, 0);//写入发送数据 - dwt_writetxfctrl(38, 0);//设定发送长度 - result = dwt_starttx(DWT_START_TX_DELAYED); + send_buffer[MESSAGE_TYPE_IDX]=MBX_RESPONSE; + send_buffer[MOTORSTATE_INDEX]=motorstate;//(remotesend_state<<4)|motorstate; + send_buffer[MOTORSTATE_INDEX]&=0x0f; + remotesend_state = 0; + + dwt_forcetrxoff(); + dwt_writetxdata(38, send_buffer, 0);//写入发送数据 + dwt_writetxfctrl(38, 0);//设定发送长度 + result = dwt_starttx(DWT_START_TX_DELAYED); // if(remotesend_state==0) // { // dwt_writetxdata(38, send_buffer, 0);//写入发送数据 @@ -228,71 +230,81 @@ // result = dwt_starttx(DWT_START_TX_DELAYED); //// uwb_timeout = 0; // if(result == 0) - uwb_timeout=lp_time; - while (!((status_reg = dwt_read32bitreg(SYS_STATUS_ID)) & (SYS_STATUS_TXFRS | SYS_STATUS_ALL_RX_ERR)))///不断查询芯片状态直到接收成功或者出现错误 - { +// { + uwb_timeout=lp_time; + while (!((status_reg = dwt_read32bitreg(SYS_STATUS_ID)) & SYS_STATUS_TXFRS ))///不断查询芯片状态直到接收成功或者出现错误 + { - current_time=HAL_LPTIM_ReadCounter(&hlptim1); - if(current_time>end_time/*||current_time<end_time+15000*/) - { -// printf("debug2 timec:%d timee:%d\r\n",current_time,end_time); - break;} -// if(lp_time-uwb_timeout>2) -// break; - }; - dwt_rxenable(0); +// current_time=HAL_LPTIM_ReadCounter(&hlptim1); +// if(current_time>end_time+((32768/1000)*3)||current_time<end_time+15000) +// { +//// printf("debug2 timec:%d timee:%d\r\n",current_time,end_time); +// break;} + if(lp_time-uwb_timeout>2) + break; + }; +// } +// dwt_rxenable(0); } -uint8_t power_and_key=0; + uint16_t target_tagid[12] = {0x1316,0x1394,0x1265,0x1318,0x1306,0x1304,0x1376,0x1312,0x1277,0x1388,0x1140,0x1392}; +uint16_t Lora_tx_ancid[50]; +uint16_t Lora_tx_ancdist[50]; +uint8_t Lora_tx_anc_electricity[50]; +uint8_t Lora_tx_ancnum=0; +uint8_t break_flag ; +uint16_t RX_TIMEOUTs_UWB; void Anchor_App(void) { - - u8 send_len,i; - u16 tempid; - uint32_t rec_syncid; - uint16_t checksum; - - + + u8 send_len,i; + u16 tempid; + uint32_t rec_syncid; + uint16_t checksum; + uint8_t kk; + dwt_setrxtimeout(0);//设定接收超时时间,0位没有超时时间 - dwt_rxenable(0);//打开接收 - - - + dwt_rxenable(0);//打开接收 + + + start_time=HAL_LPTIM_ReadCounter(&hlptim1); - end_time=start_time+((32768/1000)*20); - if(end_time>=32768) - {end_time-=32768;} - current_time=HAL_LPTIM_ReadCounter(&hlptim1); + end_time=start_time+((32768/1000)*2); + if(end_time>=32768) + { + end_time-=32768; + } + current_time=HAL_LPTIM_ReadCounter(&hlptim1); while(current_time<end_time||current_time>end_time+15000) + { + current_time=HAL_LPTIM_ReadCounter(&hlptim1); + while (!((status_reg = dwt_read32bitreg(SYS_STATUS_ID)) & (SYS_STATUS_RXFCG | SYS_STATUS_ALL_RX_ERR)))//不断查询芯片状态直到接收成功或者出现错误 { current_time=HAL_LPTIM_ReadCounter(&hlptim1); - while (!((status_reg = dwt_read32bitreg(SYS_STATUS_ID)) & (SYS_STATUS_RXFCG | SYS_STATUS_ALL_RX_ERR)))//不断查询芯片状态直到接收成功或者出现错误 - { - current_time=HAL_LPTIM_ReadCounter(&hlptim1); - if(current_time>=end_time&¤t_time<end_time+15000) - break; - }; - - if (status_reg & SYS_STATUS_RXFCG && status_reg!=0xffffffff)//成功接收 - { + if(current_time>=end_time&¤t_time<end_time+15000) + break; + }; + + if (status_reg & SYS_STATUS_RXFCG && status_reg!=0xffffffff)//成功接收 + { uint16_t tag_recv_interval; float temp_tagpos; - - dwt_write32bitreg(SYS_STATUS_ID, SYS_STATUS_RXFCG | SYS_STATUS_TXFRS); - frame_len = dwt_read32bitreg(RX_FINFO_ID) & RX_FINFO_RXFL_MASK_1023;//获得接收数据长度 - recpoll_len = frame_len; - 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); - memcpy(&anc_id_recv,&rx_buffer[ANCHOR_ID_IDX],2); - //将收到的tag_id分别写入各次通讯的包中,为多标签通讯服务,防止一次通讯中接收到不同ID标签的数据 - memcpy(&tag_id_recv,&rx_buffer[TAG_ID_IDX],2); - -// printf("ID %x\r\n",tag_id_recv); - switch(rx_buffer[MESSAGE_TYPE_IDX]) - {uint8_t target_tagi; + dwt_write32bitreg(SYS_STATUS_ID, SYS_STATUS_RXFCG | SYS_STATUS_TXFRS); + frame_len = dwt_read32bitreg(RX_FINFO_ID) & RX_FINFO_RXFL_MASK_1023;//获得接收数据长度 + recpoll_len = frame_len; + 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); + memcpy(&anc_id_recv,&rx_buffer[ANCHOR_ID_IDX],2); + //将收到的tag_id分别写入各次通讯的包中,为多标签通讯服务,防止一次通讯中接收到不同ID标签的数据 + memcpy(&tag_id_recv,&rx_buffer[TAG_ID_IDX],2); + +// HAL_GPIO_WritePin(GPIOA, GPIO_PIN_15, GPIO_PIN_SET); +// printf("ID %x\r\n",tag_id_recv); + switch(rx_buffer[MESSAGE_TYPE_IDX]) + { uint8_t target_tagi; case MBX_REG: // dwt_readdiagnostics(&d1); // LOS(&d1); @@ -307,103 +319,123 @@ // memcpy(&usart_send[22],&checksum,2); // HexToAsciiSendUDP(usart_send,24); break; - case MBX_POLL: - if(group_id==rx_buffer[GROUP_ID_IDX]) - { -// printf("timec:%d timee:%d\r\n",current_time,end_time); - dwt_readdiagnostics(&d1); - LOS(&d1); - if(firstpath_power<-100) + case MBX_POLL: + if(group_id==rx_buffer[GROUP_ID_IDX]) { - break; - } - 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<rec_nearbase_num;i++) - { - if(rec_ancidlist[i] == dev_id) +// printf("timec:%d timee:%d\r\n",current_time,end_time); + dwt_readdiagnostics(&d1); + LOS(&d1); + if(firstpath_power<-100) { -// PushAnchorDataArray(tag_id_recv,rec_ancdistlist[i],-(int8_t)firstpath_power); - - // PushAnchorDataArray(tag_id_recv,rec_ancdistlist[i],battary); + break; + } + 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<rec_nearbase_num; i++) + { + if(rec_ancidlist[i] == dev_id) + { + for(kk=0; kk<Lora_tx_ancnum; kk++) + { + if(Lora_tx_ancid[kk]==tag_id_recv) + { +// Lora_tx_ancnum--; + Lora_tx_ancdist[kk]=rec_ancdistlist[i]; + Lora_tx_anc_electricity[kk]=battary; + break_flag=1; + break; + } + } + if(break_flag) + { + break_flag=0; + break; + } + Lora_tx_ancid[Lora_tx_ancnum]=tag_id_recv; + Lora_tx_ancdist[Lora_tx_ancnum]=rec_ancdistlist[i]; + Lora_tx_anc_electricity[Lora_tx_ancnum]=battary; +// printf("接收到uwb测距:%d",Lora_tx_ancdist[0]); + Lora_tx_ancnum++; + RX_TIMEOUTs_UWB++; + } + } +//// #ifdef USART_ALL_OUTPUT +// usart_send[2] = 0x12;//正常模式 +// usart_send[3] = 8+rec_nearbase_num*4;//数据段长度 +// memcpy(&usart_send[4],&tag_id_recv,2); +// usart_send[6] = frame_seq_nb2;//包序 +// power_and_key=battary<<1;//把按键跟电量2合1,发出去 +// power_and_key=power_and_key+button; +// memcpy(usart_send+7,&power_and_key,1); +// usart_send[8] = lora_yingda_flag;//lora等待应答位 +// usart_send[9] = rec_nearbase_num;//lora等待应答位 +//// usart_send[9] = lora_yingda_flag; +// memcpy(&usart_send[10],&rec_ancidlist,2*rec_nearbase_num); +// memcpy(&usart_send[10+rec_nearbase_num*2],&rec_ancdistlist,2*rec_nearbase_num); +// checksum = Checksum_u16(&usart_send[2],8+4*rec_nearbase_num); +// memcpy(&usart_send[10+4*rec_nearbase_num],&checksum,2); +//// UART_PushFrame(usart_send,12+rec_nearbase_num*4); +//// #endif + + taglist_pos=CmpTagInList(tag_id_recv); + if(taglist_num>=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; + } + temp_tagpos=round((float)(sync_timer%g_com_map[COM_INTERVAL])/slottime); + tagpos_rec[(uint8_t)temp_tagpos]=1; + + + 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<rec_nearbase_num; i++) + { + memcpy(&tempid,&rx_buffer[FZ_NEARBASEID_INDEX+i*2],2); + if(tempid==dev_id) + { + seize_anchor=0; //非抢占。已存在列表中 + Anchor_RecNearPoll(i); + break; + } + } + + if(i==rec_nearbase_num) + { + seize_anchor=1; //抢占anchor + Anchor_RecNearPoll(i); } } -// #ifdef USART_ALL_OUTPUT - usart_send[2] = 0x12;//正常模式 - usart_send[3] = 8+rec_nearbase_num*4;//数据段长度 - memcpy(&usart_send[4],&tag_id_recv,2); - usart_send[6] = frame_seq_nb2;//包序 - power_and_key=battary<<1;//把按键跟电量2合1,发出去 - power_and_key=power_and_key+button; - memcpy(usart_send+7,&power_and_key,1); - usart_send[8] = rec_nearbase_num;//lora等待应答位 - usart_send[9] = lora_yingda_flag; - memcpy(&usart_send[10],&rec_ancidlist,2*rec_nearbase_num); - memcpy(&usart_send[10+rec_nearbase_num*2],&rec_ancdistlist,2*rec_nearbase_num); - checksum = Checksum_u16(&usart_send[2],8+4*rec_nearbase_num); - memcpy(&usart_send[10+4*rec_nearbase_num],&checksum,2); -// UART_PushFrame(usart_send,12+rec_nearbase_num*4); -// #endif + break; + } - taglist_pos=CmpTagInList(tag_id_recv); - if(taglist_num>=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; - } - temp_tagpos=round((float)(sync_timer%g_com_map[COM_INTERVAL])/slottime); - tagpos_rec[(uint8_t)temp_tagpos]=1; - - - 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<rec_nearbase_num;i++) - { - memcpy(&tempid,&rx_buffer[FZ_NEARBASEID_INDEX+i*2],2); - if(tempid==dev_id) - { - seize_anchor=0; //非抢占。已存在列表中 - Anchor_RecNearPoll(i); - break; - } - } - if(i==rec_nearbase_num) - { - seize_anchor=1; //抢占anchor - Anchor_RecNearPoll(i); - } - } - - break; - } - - }else{ + } else { // printf("debug4 timec:%d timee:%d\r\n",current_time,end_time); - dwt_write32bitreg(SYS_STATUS_ID, SYS_STATUS_ALL_RX_ERR); - dwt_rxenable(0); + dwt_write32bitreg(SYS_STATUS_ID, SYS_STATUS_ALL_RX_ERR); + dwt_rxenable(0); } } - dwt_forcetrxoff(); - dwt_entersleep(); + dwt_forcetrxoff(); + dwt_entersleep(); } -- Gitblit v1.9.3