zhyinch
2020-06-08 66596268c0f602ecc7ccbb34ea2b649108179eea
Ô´Âë/ºËÐİå/Src/application/dw_app.c
@@ -5,7 +5,7 @@
   DISCPOLL,
   GETNEARMSG,
   NEARPOLL,
}tag_state;
}tag_state=GETNEARMSG;
static dwt_config_t config = {
   2,               /* Channel number. */
   DWT_PRF_64M,     /* Pulse repetition frequency. */
@@ -25,6 +25,8 @@
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 uint8_t tx_near_msg[80] = {0};
static uint32_t frame_seq_nb = 0;   
static uint32_t status_reg = 0;
@@ -219,40 +221,61 @@
}
u8 recbase_num=0;
#define CHANGE_BASE_THRESHOLD  5
void NearAncSelect(void)
{static u16 last_mainbase_id,change_base_count;
   int32_t nearbase_mindist=99999, nearbase_minpos;
//void NearAncSelect(void)
//{static u16 last_mainbase_id,change_base_count;
//   int32_t nearbase_mindist=99999, nearbase_minpos;
//   u8 i;
//   for(i=0;i<recbase_num-1;i++)
//   {
//      if(nearbase_mindist>nearbase_distlist[i])
//      {
//         nearbase_mindist=nearbase_distlist[i];
//         nearbase_minpos=i;
//      }
//   }
//   if(nearbase_mindist<mainbase_dist-THRESHOLD_CHANGE_MAINBASE_DIST)
//   {
//      if(last_mainbase_id==nearbaseid_list[nearbase_minpos])
//      {
//         change_base_count++;
//         if(change_base_count>CHANGE_BASE_THRESHOLD)
//         {
//            mainbase_id=last_mainbase_id;
//            tag_state=GETNEARMSG;
//         }
//      }else{
//         change_base_count=0;
//      }
//      last_mainbase_id=nearbaseid_list[nearbase_minpos];
//   }else{
//      change_base_count=0;
//   }
//}
u8 GetRandomSlotPos(uint32_t emptyslot)
{
   u8 i;
   for(i=0;i<recbase_num-1;i++)
   for(i=dev_id%32;i<max_slotpos;i++)
   {
      if(nearbase_mindist>nearbase_distlist[i])
      if(((emptyslot>>i)&0x1)==0)
      {
         nearbase_mindist=nearbase_distlist[i];
         nearbase_minpos=i;
         return i;
      }
   }
   if(nearbase_mindist<mainbase_dist-THRESHOLD_CHANGE_MAINBASE_DIST)
      for(i=1;i<max_slotpos;i++)
   {
      if(last_mainbase_id==nearbaseid_list[nearbase_minpos])
      if(((emptyslot>>i)&0x1)==0)
      {
         change_base_count++;
         if(change_base_count>CHANGE_BASE_THRESHOLD)
         {
            mainbase_id=last_mainbase_id;
            tag_state=GETNEARMSG;
         }
      }else{
         change_base_count=0;
         return i;
      }
      last_mainbase_id=nearbaseid_list[nearbase_minpos];
   }else{
      change_base_count=0;
   }
return max_slotpos-1;
}
u8 test=0;
u8 anclost_times=0;
u8 exsistbase_list[MAX_NEARBASE_NUM],report_num,get_newbase=0;;
u16 temp_sync_timer1,temp_sync_timer2;
u32 rec_tagpos_binary;
void NearPoll(void)
{
   static u8 mainbase_lost_count=0,flag_finalsend,flag_rxon;
@@ -381,6 +404,9 @@
                           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);//设定发送数据长度
                           memcpy(&rec_tagpos_binary,&rx_buffer[NEARMSG_EMPTYSLOTPOS_INDEX],4);
                           tagslotpos=GetRandomSlotPos(rec_tagpos_binary);
                           if(temp_dist!=0x1ffff)
                           {
                           #ifndef USART_INTEGRATE_OUTPUT
@@ -458,22 +484,21 @@
         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);
            }
            tyncpoll_time=(random_value%max_slotpos)*slottime;
//          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);
//            }
            tyncpoll_time = (tagslotpos%max_slotpos)*slottime;
         }
      //   tyncpoll_time=0;
         next_nearbase_num=0;
         for(i=0;i<last_nearbase_num+get_newbase;i++)
         {
            if(exsistbase_list[i]>0)
            {
            {
               next_nearbase_num++;
               true_exsistbase_list[j]=exsistbase_list[i];
               true_nearbase_idlist[j]=nearbaseid_list[i];         
@@ -551,51 +576,69 @@
}
//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;
//      }
//   }
//}
u8 nearmsg_mainbase=0,rec_tagpos_emptylist[32];
void GetNearMsg(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);
   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数据
      {
         next_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],next_nearbase_num*2);
         tyncpoll_time=tagslotpos*slottime;
         tag_state=NEARPOLL;
      }
   }
}
void Tag_App(void)//发送模式(TAG标签)
{
   //LED0_ON;
   g_Resttimer=0;
   NearPoll();
   switch(tag_state)
   {
      case DISCPOLL:
         break;
      case GETNEARMSG:
           GetNearMsg();
         break;
      case NEARPOLL:
            NearPoll();
         break;
   }
}
int8_t correction_time,new_tagid=0;
@@ -702,7 +745,7 @@
            dwt_write32bitreg(SYS_STATUS_ID, SYS_STATUS_ALL_RX_ERR);
         }
}
u8 misdist_num,seize_anchor;
u8 misdist_num[TAG_NUM_IN_SYS],seize_anchor;
u8 Anchor_RecNearPoll(u8 ancrec_nearbasepos) //0 mainbase  1 first near_base
{
         tmp_time=TIM3->CNT;
@@ -785,9 +828,9 @@
               g_flag_Taggetdist[taglist_pos]=0;
               if(hex_dist>-1000&&hex_dist<100000)
               {
               if(abs(hex_dist-his_dist[taglist_pos])<1500||misdist_num>3)
               if(abs(hex_dist-his_dist[taglist_pos])<1500||misdist_num[taglist_pos]>3)
               {
                  misdist_num=0;
                  misdist_num[taglist_pos]=0;
               tagdist_list[taglist_pos] = hex_dist;   
               his_dist[taglist_pos]=hex_dist;   
            #ifndef USART_INTEGRATE_OUTPUT
@@ -809,19 +852,20 @@
            #endif
               }else{
               //   printf("%d",hex_dist);
                  misdist_num++;
                  misdist_num[taglist_pos]++;
               }
            }
         }
         }else{
               //printf("%x/n",status_reg);
            dwt_write32bitreg(SYS_STATUS_ID, SYS_STATUS_ALL_RX_ERR);
         }
}
uint32_t current_syncid=0xffffffff,synclost_timer;
extern u8 flag_syncbase;
extern uint32_t tagpos_binary;
u8 tagpos_rec[50],tagpos_send[50],ancidlist_num;
u16 ancidlist_rec[20],ancidlist_send[20];
void Anchor_App(void)
{
   
@@ -841,20 +885,20 @@
   if (status_reg & SYS_STATUS_RXFCG)//成功接收
   { u16 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;//获得接收数据长度
      dwt_readrxdata(rx_buffer, frame_len, 0);//读取接收数据
      memcpy(&anc_id_recv,&rx_buffer[ANCHOR_ID_IDX],2);
      //将收到的tag_id分别写入各次通讯的包中,为多标签通讯服务,防止一次通讯中接收到不同ID标签的数据
      //tag_id_recv = rx_buffer[TAG_ID_IDX];
      tag_id_recv = rx_buffer[TAG_ID_IDX];
      switch(rx_buffer[MESSAGE_TYPE_IDX])
      {
//         case POLL:
//            if (anchor_type == rx_buffer[ANC_TYPE_IDX])
//            Anchor_RecPoll();
//            break;
         case SYNC:
         case SYNC:
            memcpy(&rec_syncid,&rx_buffer[ANCHOR_ID_IDX],4);
            if(rec_syncid<current_syncid)
            {
@@ -879,25 +923,24 @@
            
            }
            break;
//         case NEAR_MSG:
//            if(anc_id_recv==dev_id)
//            {
//               rx_buffer[TAGSLOTPOS]=taglist_pos;
//               tx_near_msg[MESSAGE_TYPE_IDX] = NEAR_MSG;
//               memcpy(&tx_near_msg[TAG_ID_IDX],&tag_id_recv,2);
//               tx_near_msg[NEARBASENUM_INDEX]=g_com_map[NEARBASE_NUM];
//               memcpy(&tx_near_msg[NEARBASEID_INDEX],&g_com_map[NEARBASE_ID1],g_com_map[NEARBASE_NUM]*2);
//               send_len=11+g_com_map[NEARBASE_NUM]*2+2;
//               dwt_writetxdata(send_len, tx_near_msg, 0);//将Poll包数据传给DW1000,将在开启发送时传出去
//               dwt_writetxfctrl(send_len, 0);//设置超宽带发送数据长度
//               dwt_starttx(DWT_START_TX_IMMEDIATE);
//            }
//            break;
//
         case NEAR_POLL:
         case NEAR_MSG:
            if(anc_id_recv==flag_syncbase)
            {
               rx_buffer[TAGSLOTPOS]=taglist_pos;
               tx_near_msg[MESSAGE_TYPE_IDX] = NEAR_MSG;
               memcpy(&tx_near_msg[TAG_ID_IDX],&tag_id_recv,2);
               memcpy(&tx_near_msg[NEARMSG_EMPTYSLOTPOS_INDEX],&tagpos_binary,4);
               tx_near_msg[NEARBASENUM_INDEX]=ancidlist_num;
               memcpy(&tx_near_msg[NEARBASEID_INDEX],&ancidlist_send,ancidlist_num*2);
               send_len=11+ancidlist_num*2+2;
               dwt_writetxdata(send_len, tx_near_msg, 0);//将Poll包数据传给DW1000,将在开启发送时传出去
               dwt_writetxfctrl(send_len, 0);//设置超宽带发送数据长度
               dwt_starttx(DWT_START_TX_IMMEDIATE);
            }
            break;
         case NEAR_POLL:
            memcpy(&tag_id_recv,&rx_buffer[TAG_ID_IDX],2);
            memcpy(&anc_id_recv,&rx_buffer[ANCHOR_ID_IDX],2);
            taglist_pos=CmpTagInList(tag_id_recv);
            if(taglist_pos==taglist_num)
            {
@@ -909,10 +952,16 @@
               new_tagid=0;
            }
            tagofflinetime[taglist_pos]=0;
          temp_tagpos=round((float)(sync_timer%g_com_map[COM_INTERVAL])/slottime);
            tagpos_rec[(u8)temp_tagpos]=1;
            rec_nearbase_num=rx_buffer[NEARBASENUM_INDEX];
         
            if(rec_nearbase_num>ancidlist_num)
               {
                  ancidlist_num=rec_nearbase_num;
                  memcpy(ancidlist_rec,&rx_buffer[NEARBASEID_INDEX],rec_nearbase_num*2);
               }
            for(i=0;i<rec_nearbase_num;i++)
            {
                memcpy(&tempid,&rx_buffer[NEARBASEID_INDEX+i*2],2);
@@ -928,14 +977,11 @@
                  seize_anchor=1;   //抢占anchor
                  Anchor_RecNearPoll(i);   
               }
            
            break;
      }
   }
   else
   {
            break;
      }
   }else{
      dwt_write32bitreg(SYS_STATUS_ID, SYS_STATUS_ALL_RX_ERR);
   }
}