zhyinch
2020-04-27 5bfa1bc693623159c5059067f8db7589fabd04a1
Ô´Âë/ºËÐİå/Src/application/dw_app.c
@@ -22,7 +22,9 @@
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};
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 uint32_t frame_seq_nb = 0;   
static uint32_t status_reg = 0;
@@ -144,8 +146,9 @@
   memcpy(&tx_final_msg[TAG_ID_IDX], &dev_id, 2);
   memcpy(&tx_resp_msg[ANCHOR_ID_IDX], &dev_id, 2);
   memcpy(&tx_sync_msg[ANCHOR_ID_IDX], &dev_id, 2);
   memcpy(&tx_near_msg[ANCHOR_ID_IDX], &dev_id, 2);
   memcpy(&tx_near_msg[TAG_ID_IDX], &dev_id, 2);
   memcpy(&tx_nearresp_msg[ANCHOR_ID_IDX], &dev_id, 2);
   memcpy(&tx_nearpoll_msg[TAG_ID_IDX], &dev_id, 2);
   memcpy(&tx_nearfinal_msg[TAG_ID_IDX], &dev_id, 2);
}   
uint16_t Checksum_u16(uint8_t* pdata, uint32_t len) 
{
@@ -158,7 +161,7 @@
}
u16 tag_time_recv[TAG_NUM_IN_SYS];
u8 usart_send[100];
u8 usart_send[100],usart_send_anc[100];
u8 battary,button;
extern uint8_t g_pairstart;
void tag_sleep_configuraion(void)
@@ -247,6 +250,7 @@
   uint32_t final_tx_time;
   u32 start_poll;
   u8 i,j,getsync_flag=0,timeout;
//   printf("%d",sync_timer);
      dwt_forcetrxoff();
    dwt_setrxaftertxdelay(POLL_TX_TO_RESP_RX_DLY_UUS);         //设置发送后开启接收,并设定延迟时间
    dwt_setrxtimeout(RESP_RX_TIMEOUT_UUS);      
@@ -258,14 +262,14 @@
   //nearbase_num=0;
   recbase_num=0;
   
   tx_near_msg[BATTARY_IDX] = Get_Battary();
   tx_near_msg[BUTTON_IDX] = !READ_KEY0;
   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;
   memcpy(&tx_near_msg[ANCHOR_ID_IDX],&mainbase_id,2);
   dwt_writetxdata(13+2*nearbase_num, tx_near_msg, 0);//将Poll包数据传给DW1000,将在开启发送时传出去
   tx_nearpoll_msg[BATTARY_IDX] = Get_Battary();
   tx_nearpoll_msg[BUTTON_IDX] = !READ_KEY0;
   tx_nearpoll_msg[SEQUENCE_IDX] = frame_seq_nb++;
   tx_nearpoll_msg[NEARBASENUM_INDEX] = nearbase_num;
   memcpy(&tx_nearpoll_msg[NEARBASEID_INDEX],&nearbaseid_list,nearbase_num*2);
   tx_nearpoll_msg[MESSAGE_TYPE_IDX] = NEAR_POLL;
   memcpy(&tx_nearpoll_msg[ANCHOR_ID_IDX],&mainbase_id,2);
   dwt_writetxdata(13+2*nearbase_num, tx_nearpoll_msg, 0);//将Poll包数据传给DW1000,将在开启发送时传出去
   dwt_writetxfctrl(13+2*nearbase_num, 0);//设置超宽带发送数据长度
   dwt_starttx(DWT_START_TX_IMMEDIATE | DWT_RESPONSE_EXPECTED);//开启发送,发送完成后等待一段时间开启接收,等待时间在dwt_setrxaftertxdelay中设置
@@ -319,25 +323,25 @@
                        {
                        nearbaseid_list[0]=rec_nearbaseid;
                        nearbase_num=1;
                        memcpy(&tx_near_msg[ANCHOR_ID_IDX],&rec_nearbaseid,2);
                        memcpy(&tx_nearfinal_msg[ANCHOR_ID_IDX],&rec_nearbaseid,2);
                        }
                        if(rec_nearbaseid==nearbaseid_list[0])
                        {
                           //////////////////////////////////时间同步
//                           memcpy(&sync_timer,&rx_buffer[ANCTIMEMS],2);
//                           memcpy(&tmp_time,&rx_buffer[ANCTIMEUS],2);
//                           exsistbase_list[0]=1;
                           memcpy(&sync_timer,&rx_buffer[ANCTIMEMS],2);
                           memcpy(&tmp_time,&rx_buffer[ANCTIMEUS],2);
                           exsistbase_list[0]=1;
////                           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;}
//                           }
//                           TIM3->CNT=tmp_time;
                           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;
                           
//                           if(tagslotpos>max_slotpos)
//                              tagslotpos=tagslotpos%(max_slotpos+1);
@@ -355,11 +359,11 @@
                           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
                           final_msg_set_ts(&tx_nearfinal_msg[FINAL_MSG_POLL_TX_TS_IDX], poll_tx_ts);//将T1,T4,T5写入发送数据
                           final_msg_set_ts(&tx_nearfinal_msg[FINAL_MSG_RESP_RX_NEARBASE_IDX], resp_rx_ts);
                           final_msg_set_ts(&tx_nearfinal_msg[FINAL_MSG_FINAL_TX_TS_IDX], final_tx_ts);
                           tx_nearfinal_msg[MESSAGE_TYPE_IDX]=NEAR_FINAL;
                           dwt_writetxdata(28+nearbase_num*4, tx_nearfinal_msg, 0);//将发送数据写入DW1000
                           dwt_writetxfctrl(28+nearbase_num*4, 0);//设定发送数据长度
                           if(temp_dist!=0x1ffff)
                           {
@@ -384,15 +388,15 @@
                           {
                              nearbase_num++;
                              nearbaseid_list[nearbase_num] = rec_nearbaseid;
                              memcpy(&tx_near_msg[ANCHOR_ID_IDX],&rec_nearbaseid,2);
                              memcpy(&tx_nearfinal_msg[ANCHOR_ID_IDX],&rec_nearbaseid,2);
                           }
                           
                           exsistbase_list[rec_nearbasepos]=1;
                           memcpy(&temp_dist,&rx_buffer[DIST_IDX],4);
                           nearbase_distlist[rec_nearbasepos]=temp_dist;
                           
                           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
                           final_msg_set_ts(&tx_nearfinal_msg[FINAL_MSG_RESP_RX_NEARBASE_IDX+(rec_nearbasepos)*4], resp_rx_ts);
                           dwt_writetxdata(28+nearbase_num*4, tx_nearfinal_msg, 0);//将发送数据写入DW1000
                           dwt_writetxfctrl(28+nearbase_num*4, 0);//设定发送数据长度
                           LED0_BLINK;
                           if(temp_dist!=0x1ffff)
@@ -466,16 +470,17 @@
            nearbase_distlist[i]=true_nearbase_distlist[i];
            if(nearbase_distlist[i]!=0x1ffff)
            {
               memcpy(&usart_send[3+6*report_num],&nearbaseid_list[i],2);
               memcpy(&usart_send[5+6*report_num],&nearbase_distlist[i],4);
               memcpy(&usart_send[4+6*report_num],&nearbaseid_list[i],2);
               memcpy(&usart_send[6+6*report_num],&nearbase_distlist[i],4);
               report_num++;
            }
         }
         #ifdef USART_INTEGRATE_OUTPUT      
            usart_send[2] = report_num;//正常模式
            checksum = Checksum_u16(&usart_send[2],report_num*6+1);
            memcpy(&usart_send[3+report_num*6],&checksum,2);
            UART_PushFrame(usart_send,5+report_num*6);
            usart_send[2] = 4;//正常模式
            usart_send[3] = report_num*6+2;//正常模式
            checksum = Checksum_u16(&usart_send[2],report_num*6+2);
            memcpy(&usart_send[4+report_num*6],&checksum,2);
            UART_PushFrame(usart_send,6+report_num*6);
         #endif
//         if(mainbase_lost_count>5)
//         {
@@ -498,49 +503,48 @@
}
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;
      }
   }
}
//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;
//      }
//   }
//}
void Tag_App(void)//发送模式(TAG标签)
{
   //LED0_ON;
   dwt_forcetrxoff();
   g_Resttimer=0;
   NearPoll();
}
@@ -653,10 +657,10 @@
u8 Anchor_RecNearPoll(u8 ancrec_nearbasepos) //0 mainbase  1 first near_base
{
         tmp_time=TIM3->CNT;
         memcpy(&tx_near_msg[ANCTIMEMS],&sync_timer,2);
         memcpy(&tx_near_msg[ANCTIMEUS],&tmp_time,2);
         memcpy(&tx_near_msg[TAGSLOTPOS],&taglist_pos,2);
         memcpy(&tx_near_msg[TAG_ID_IDX],&tag_id_recv,2);
         memcpy(&tx_nearresp_msg[ANCTIMEMS],&sync_timer,2);
         memcpy(&tx_nearresp_msg[ANCTIMEUS],&tmp_time,2);
         memcpy(&tx_nearresp_msg[TAGSLOTPOS],&taglist_pos,2);
         memcpy(&tx_nearresp_msg[TAG_ID_IDX],&tag_id_recv,2);
         poll_rx_ts = get_rx_timestamp_u64();//获得Poll包接收时间T2
         resp_tx_time = (poll_rx_ts + ((POLL_RX_TO_RESP_TX_DLY_UUS+ancrec_nearbasepos*DELAY_BETWEEN_TWO_FRAME_UUS) * UUS_TO_DWT_TIME)) >> 8;//计算Response发送时间T3。
@@ -667,13 +671,13 @@
         if(new_tagid)
         {
            tagdist_list[taglist_pos]=0x1ffff;
            memcpy(&tx_near_msg[DIST_IDX], &tagdist_list[taglist_pos], 4);
            memcpy(&tx_nearresp_msg[DIST_IDX], &tagdist_list[taglist_pos], 4);
         }else{
            memcpy(&tx_near_msg[DIST_IDX], &tagdist_list[taglist_pos], 4);
            memcpy(&tx_nearresp_msg[DIST_IDX], &tagdist_list[taglist_pos], 4);
         }
   
         tx_near_msg[MESSAGE_TYPE_IDX]=NEAR_RESPONSE;
         dwt_writetxdata(20, tx_near_msg, 0);//写入发送数据
         tx_nearresp_msg[MESSAGE_TYPE_IDX]=NEAR_RESPONSE;
         dwt_writetxdata(20, tx_nearresp_msg, 0);//写入发送数据
         dwt_writetxfctrl(20, 0);//设定发送长度
         result = dwt_starttx(DWT_START_TX_DELAYED | DWT_RESPONSE_EXPECTED);//延迟发送,等待接收
@@ -694,7 +698,7 @@
            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(seize_anchor&&memcmp(&rx_buffer[ANCHOR_ID_IDX],&dev_id,2))
         if(seize_anchor&&memcmp(&rx_buffer[ANCHOR_ID_IDX],&dev_id,2)) //抢占anchor å¤±è´¥
         {
            return 1;
         }
@@ -748,8 +752,8 @@
               memcpy(&usart_send[19],&checksum,2);
               UART_PushFrame(usart_send,21);
            #else      
               memcpy(&usart_send[3+6*anc_report_num],&tag_id_recv,2);
               memcpy(&usart_send[5+6*anc_report_num],&tagdist_list[taglist_pos],4);
               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{
@@ -837,14 +841,14 @@
                memcpy(&tempid,&rx_buffer[NEARBASEID_INDEX+i*2],2);
               if(tempid==dev_id)
               {
                  seize_anchor=0;
                  seize_anchor=0;  //非抢占。已存在列表中
                  Anchor_RecNearPoll(i);   
                  break;
               }                  
            }
               if(i==rec_nearbase_num)
               {
                  seize_anchor=1;
                  seize_anchor=1;   //抢占anchor
                  Anchor_RecNearPoll(i);   
               }