yincheng.zhong
2024-01-29 526f2fbdaa4532c5bc0b6dffd7b9b84f784d7fef
Ô´Âë/ºËÐİå/Src/application/dw_app.c
@@ -9,7 +9,7 @@
   NEARPOLL,
}tag_state=NEARPOLL;
static dwt_config_t config = {
   5,               /* Channel number. */
   2,               /* Channel number. */
   DWT_PRF_64M,     /* Pulse repetition frequency. */
   DWT_PLEN_128,    /* Preamble length. */
   DWT_PAC8,        /* Preamble acquisition chunk size. Used in RX only. */
@@ -128,8 +128,9 @@
    /* Configure DW1000. See NOTE 6 below. */
    dwt_configure(&config);//配置DW1000
    //dwt_setinterrupt(DWT_INT_TFRS | DWT_INT_RFCG | (DWT_INT_ARFE | DWT_INT_RFSL | DWT_INT_SFDT | DWT_INT_RPHE | DWT_INT_RFCE | DWT_INT_RFTO | DWT_INT_RXPTO), 1);
    /* Apply default antenna delay value. See NOTE 1 below. */
    dwt_setrxantennadelay(RX_ANT_DLY);      //设置接收天线延迟
    dwt_settxantennadelay(0);      //设置发射天线延迟
@@ -186,7 +187,6 @@
   dwt_forcetrxoff();      //关闭接收,以防在RX ON çŠ¶æ€
   
   
   tx_sync_msg[GROUP_ID_IDX] = group_id;
   tx_sync_msg[SYNC_SEQ_IDX]=sync_seq;
   memcpy(&tx_sync_msg[ANCHOR_ID_IDX],&sync_baseid,4);
   dwt_writetxdata(sizeof(tx_sync_msg), tx_sync_msg, 0);//将Poll包数据传给DW1000,将在开启发送时传出去
@@ -216,13 +216,13 @@
u16 nearbaseid_list[MAX_NEARBASE_NUM],mainbase_id,true_nearbase_idlist[MAX_NEARBASE_NUM];
int32_t mainbase_dist,nearbase_distlist[MAX_NEARBASE_NUM],true_nearbase_distlist[MAX_NEARBASE_NUM],true_exsistbase_list[MAX_NEARBASE_NUM];
uint8_t trygetnearmsg_times;
u16 current_slotnum,total_slotnum,target_time,last_time,record_time[10],record_i;
u16 current_slotnum,total_slotnum,target_time,last_time;
u32 rec_tagpos_binary;
extern uint32_t tagpos_binary;
void SetNextPollTime(u16 time)
{
   current_slotnum++;
   if(current_slotnum>=total_slotnum)
   if(current_slotnum==total_slotnum)
      current_slotnum-=total_slotnum;
   //time=5;
   target_time=((current_slotnum*g_com_map[COM_INTERVAL])+time);
@@ -239,11 +239,7 @@
   {target_time-=1000;}
   if(target_time<0)
   {target_time+=1000;}
record_time[record_i++]=target_time;
   if(record_i>=10)
   {
      record_i=0;
   }
}
u8 FindNearBasePos(u16 baseid)
{
@@ -426,7 +422,7 @@
                           memcpy(&tmp_time,&rx_buffer[ANCTIMEUS],2);
                           
                           
                           //if(g_com_map[DEV_ROLE]!=0)
                           if(g_com_map[DEV_ROLE]!=0)
                           {
                           sync_timer=temp_sync_timer1;
////                           memcpy(&tagslotpos,&rx_buffer[TAGSLOTPOS],2);      
@@ -469,28 +465,24 @@
                           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);
                                IWDG_Feed();
                        if(temp_dist!=0x1ffff)
                           {
                              g_Resttimer=0;
                    IWDG_Feed();
                              #ifdef USART_SINGLE_OUTPUT
                              usart_send[2] = 1;//正常模式
                              usart_send[3] = 17;//数据段长度
                              usart_send[4] = frame_seq_nb;//数据段长度
                              if(g_com_map[DEV_ROLE])
                              {
                              memcpy(&usart_send[5],&dev_id,2);
                              memcpy(&usart_send[7],&rec_nearbaseid,2);      
                              }else{
                              memcpy(&usart_send[5],&rec_nearbaseid,2);
                              memcpy(&usart_send[7],&dev_id,2);
                              }
                              memcpy(&usart_send[9],&rx_buffer[DIST_IDX],4);
                              usart_send[13] = battary;
                              usart_send[14] = button;
                              checksum = Checksum_u16(&usart_send[2],17);
                              memcpy(&usart_send[19],&checksum,2);
                              if(g_com_map[MODBUS_MODE]!=1)
                              UART_PushFrame(usart_send,21);
                              #endif
@@ -528,20 +520,15 @@
                              usart_send[2] = 1;//正常模式
                              usart_send[3] = 17;//数据段长度
                              usart_send[4] = frame_seq_nb;//数据段长度
                              if(g_com_map[DEV_ROLE])
                              {
                              memcpy(&usart_send[5],&dev_id,2);
                              memcpy(&usart_send[7],&rec_nearbaseid,2);      
                              }else{
                              memcpy(&usart_send[5],&rec_nearbaseid,2);
                              memcpy(&usart_send[7],&dev_id,2);
                              }
                              memcpy(&usart_send[9],&rx_buffer[DIST_IDX],4);
                              usart_send[13] = battary;
                              usart_send[14] = button;
                              checksum = Checksum_u16(&usart_send[2],17);
                              memcpy(&usart_send[19],&checksum,2);
                              if(g_com_map[MODBUS_MODE]!=1)
                              UART_PushFrame(usart_send,21);
                              #endif
@@ -723,7 +710,6 @@
{
   //LED0_ON;
   dwt_forcetrxoff();
    dwt_setinterrupt(DWT_INT_TFRS | 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);
      GPIO_WriteBit(GPIOA, GPIO_Pin_10, Bit_SET);   
   switch(tag_state)
   {
@@ -746,7 +732,7 @@
int8_t correction_time,new_tagid=0;
extern uint8_t sync_seq;
u16 taglist_num=0,taglist_pos;
u16 tagid_list[TAG_NUM_IN_SYS],tagstate_list[TAG_NUM_IN_SYS];
u16 tagid_list[TAG_NUM_IN_SYS],tagstate_list[TAG_NUM_IN_SYS];;
u8 tagofflinetime[TAG_NUM_IN_SYS];
int32_t tagdist_list[TAG_NUM_IN_SYS];
void TagListUpdate(void)
@@ -890,30 +876,41 @@
         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);//接收超时时间
         
         if(tagdist_list[taglist_pos]<g_com_map[ALARM_DISTANCE1])
         {
            motorstate =0;
         }else if(tagdist_list[taglist_pos]<g_com_map[ALARM_DISTANCE2])
         {
            motorstate =2;
         }else if(tagdist_list[taglist_pos]<g_com_map[ALARM_DISTANCE3])
         {
            motorstate =1;
         }else{
            motorstate =0;
         }
         
         if(new_tagid)
         {
            tagdist_list[taglist_pos]=0x1ffff;
            memcpy(&tx_nearresp_msg[DIST_IDX], &tagdist_list[taglist_pos], 4);
         }else{
            memcpy(&tx_nearresp_msg[DIST_IDX], &tagdist_list[taglist_pos], 4);
         }
            if(tag_id_recv>>12!=9)
            {
                if(tagdist_list[taglist_pos]<g_com_map[ALARM_DISTANCE1])
                {
                    motorstate =0;
                }else if(tagdist_list[taglist_pos]<g_com_map[ALARM_DISTANCE2])
                {
                    motorstate =2;
                }else if(tagdist_list[taglist_pos]<g_com_map[ALARM_DISTANCE3])
                {
                    motorstate =1;
                }else{
                    motorstate =0;
                }
        }else{
                if(tagdist_list[taglist_pos]<g_com_map[RELAY2_DISTANCE1])
                {
                    motorstate =0;
                }else if(tagdist_list[taglist_pos]<g_com_map[RELAY2_DISTANCE2])
                {
                    motorstate =2;
                }else if(tagdist_list[taglist_pos]<g_com_map[RELAY2_DISTANCE3])
                {
                    motorstate =1;
                }else{
                    motorstate =0;
                }
        }
            tx_nearresp_msg[GROUP_ID_IDX] = group_id;
         tx_nearresp_msg[MAINBASE_INDEX]=flag_syncbase;
         tx_nearresp_msg[MESSAGE_TYPE_IDX]=NEAR_RESPONSE;
         tx_nearresp_msg[MOTORSTATE_INDEX]=(remotesend_state<<4)|motorstate;
            remotesend_state = 0;
         tx_nearresp_msg[MOTORSTATE_INDEX]=(remotesend_state<<4)|(motorstate&0xf);
         if(remotesend_state)
         {
             memcpy(&tx_nearresp_msg[REMOTEPARA_INDEX],remotetag_para,REMOTEPARA_LEN);
@@ -1008,7 +1005,7 @@
                  {
                            g_Tagdist[taglist_pos]=hex_dist/10;   
                        }else{
                            g_Tagdist[taglist_pos]= 1;
                        //    g_Tagdist[taglist_pos]= 1;
                        }
            #ifdef USART_SINGLE_OUTPUT
               usart_send[2] = 1;//正常模式 
@@ -1016,8 +1013,8 @@
               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]=10;
                    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;
@@ -1027,12 +1024,12 @@
               memcpy(&usart_send[19],&checksum,2);
               if(g_com_map[MODBUS_MODE]!=1)
               UART_PushFrame(usart_send,21);
               tagstate_list[taglist_pos] = button<<8|battary;
            #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
                    tagstate_list[taglist_pos] = (button<<8)|battary;
               for(i=0;i<taglist_num-1;i++)
               {
                  if( tagdist_list[i]>tagdist_list[i+1]&&tagdist_list[i+1]!=0)
@@ -1058,7 +1055,6 @@
                  Modbus_HoldReg[i*4+1] = tagstate_list[i];
                  memcpy(&Modbus_HoldReg[i*4+2],&tagdist_list[i],4);
               }
               }else{
               //   printf("%d",hex_dist);
                  misdist_num[taglist_pos]++;
@@ -1074,19 +1070,6 @@
extern u8 flag_syncbase;
u8 tagpos_rec[50],tagpos_send[50],ancidlist_num;
u16 ancidlist_rec[20],ancidlist_send[20],rec_ancidlist[20],rec_ancdistlist[20];
void Anchor_Start(void)
{
dwt_write32bitreg(SYS_STATUS_ID, SYS_STATUS_ALL_RX_ERR| SYS_STATUS_TXFRS |SYS_STATUS_RXFCG);
   g_start_sync_flag=0;
dwt_setinterrupt(DWT_INT_TFRS | DWT_INT_RFCG | (DWT_INT_ARFE | DWT_INT_RFSL | DWT_INT_SFDT | DWT_INT_RPHE | DWT_INT_RFCE | DWT_INT_RFTO | DWT_INT_RXPTO), 1);
   dwt_setrxtimeout(1000);//设定接收超时时间,0位没有超时时间
   dwt_rxenable(0);//打开接收
//    while (!((status_reg = dwt_read32bitreg(SYS_STATUS_ID)) & (SYS_STATUS_RXFCG | SYS_STATUS_ALL_RX_ERR))&&!g_start_send_flag&&!g_start_sync_flag)//不断查询芯片状态直到接收成功或者出现错误
//   {
//      //IdleTask();
//   };
}
void Anchor_App(void)
{
   
@@ -1094,19 +1077,17 @@
   u16 tempid;
   uint32_t rec_syncid;
   
//   dwt_write32bitreg(SYS_STATUS_ID, SYS_STATUS_ALL_RX_ERR| SYS_STATUS_TXFRS |SYS_STATUS_RXFCG);
//   g_start_sync_flag=0;
   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))&&!g_start_send_flag&&!g_start_sync_flag)//不断查询芯片状态直到接收成功或者出现错误
//   {
//
//      IdleTask();
//   };
   dwt_setinterrupt(DWT_INT_TFRS | 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);
   status_reg = dwt_read32bitreg(SYS_STATUS_ID);
   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))&&!g_start_send_flag&&!g_start_sync_flag)//不断查询芯片状态直到接收成功或者出现错误
   {
      IdleTask();
   };
//GPIO_WriteBit(GPIOA, GPIO_Pin_10, Bit_RESET);   
   if (status_reg & SYS_STATUS_RXFCG)//成功接收
   { u16 tag_recv_interval;
@@ -1129,29 +1110,29 @@
//            Anchor_RecPoll();
//            break;
         case SYNC:               
            memcpy(&rec_syncid,&rx_buffer[ANCHOR_ID_IDX],4);
            if(rec_syncid<current_syncid)
            {
               current_syncid=rec_syncid;
               flag_syncbase=0;
               sync_seq=rx_buffer[SYNC_SEQ_IDX]+1;
               TIM3->CNT = sync_seq*325%1000+15;
               sync_timer = sync_seq*325/1000;
               synclost_timer=0;
               //SyncPoll(sync_seq,rec_syncid);
               }else if(rec_syncid==current_syncid)
            {
               if(rx_buffer[SYNC_SEQ_IDX]<sync_seq)
                  {
                     flag_syncbase=0;
                     sync_seq=rx_buffer[SYNC_SEQ_IDX]+1;
                     TIM3->CNT = sync_seq*325%1000+5;
                     sync_timer = sync_seq*325/1000+995;
                     synclost_timer=0;
                     //SyncPoll(sync_seq,rec_syncid);
                  }
            }
//            memcpy(&rec_syncid,&rx_buffer[ANCHOR_ID_IDX],4);
//            if(rec_syncid<current_syncid)
//            {
//               current_syncid=rec_syncid;
//               flag_syncbase=0;
//               sync_seq=rx_buffer[SYNC_SEQ_IDX]+1;
//               TIM3->CNT = sync_seq*325%1000+15;
//               sync_timer = sync_seq*325/1000;
//               synclost_timer=0;
//               //SyncPoll(sync_seq,rec_syncid);
//               }else if(rec_syncid==current_syncid)
//            {
//               if(rx_buffer[SYNC_SEQ_IDX]<sync_seq)
//                  {
//                     flag_syncbase=0;
//                     sync_seq=rx_buffer[SYNC_SEQ_IDX]+1;
//                     TIM3->CNT = sync_seq*325%1000+5;
//                     sync_timer = sync_seq*325/1000+995;
//                     synclost_timer=0;
//                     //SyncPoll(sync_seq,rec_syncid);
//                  }
//
//            }
            break;
         case NEAR_MSG:
            if(anc_id_recv==flag_syncbase)
@@ -1177,7 +1158,7 @@
            memcpy(&tag_id_recv,&rx_buffer[TAG_ID_IDX],2);
                memcpy(&rec_ancidlist,&rx_buffer[NEARBASEID_INDEX],2*rec_nearbase_num);
                memcpy(&rec_ancdistlist,&rx_buffer[NEARBASEID_INDEX+2*rec_nearbase_num],2*rec_nearbase_num);
                memcpy(&rec_antdelay,&rx_buffer[NEARBASEID_INDEX+nearbase_num*4],2);
                memcpy(&rec_antdelay,&rx_buffer[NEARBASEID_INDEX+rec_nearbase_num*4],2);
            #ifdef USART_ALL_OUTPUT
                    usart_send[2] = 0x0c;//正常模式 
               usart_send[3] = 8+rec_nearbase_num*4;//数据段长度