keil/uwb_app.c
@@ -936,7 +936,7 @@
    struct PHY_ADV_CONFIG_T adv_config = {
        .thres_fap_detect = 40,
        .nth_scale_factor = 4,
        .ranging_performance_mode = 3,
        .ranging_performance_mode = 0,
        .skip_weakest_port_en = 0,
    };
   #endif
@@ -958,218 +958,243 @@
      #endif
      mac_register_process_handler(tx_int_callback, rx_int_callback);//初始化回调
}
//主函数绑定接受逻辑
int UwbSearch(void)
{
    uint8_t i;
    uint16_t tempid;
    // The following peripherals will be initialized in the uwb_open function
    // phy/mac/aes/lsp/phy timers initialized
    uwb_open();
   #ifdef STS_MODE
  // Set STS key and IV
    phy_sts_key_configure(&sts_iv_key);
////主函数绑定接受逻辑
//int UwbSearch(void)
//{
//    uint8_t i;
//    uint16_t tempid;
//    // The following peripherals will be initialized in the uwb_open function
//    // phy/mac/aes/lsp/phy timers initialized
//    uwb_open();
//   #ifdef STS_MODE
//  // Set STS key and IV
//    phy_sts_key_configure(&sts_iv_key);
//
//   // which RX ports will be used for AoA/PDoA
//    phy_rx_ant_mode_set(RX_ANT_PORTS_COMBINATION);
//   #endif
//    // Set calibration parameters
//    uwb_calibration_params_set(config.phy_cfg.ch_num);
   
   // which RX ports will be used for AoA/PDoA
    phy_rx_ant_mode_set(RX_ANT_PORTS_COMBINATION);
   #endif
    // Set calibration parameters
    uwb_calibration_params_set(config.phy_cfg.ch_num);
//   #ifndef STS_MODE
//   // set advanced parameters
//    struct PHY_ADV_CONFIG_T adv_config = {
//        .thres_fap_detect = 40,
//        .nth_scale_factor = 4,
//        .ranging_performance_mode = 0,
//        .skip_weakest_port_en = 0,
//    };
//      #else
//        // set advanced parameters
//    struct PHY_ADV_CONFIG_T adv_config = {
//        .thres_fap_detect = 40,
//        .nth_scale_factor = 4,
//        .ranging_performance_mode = 3,
//        .skip_weakest_port_en = 0,
//    };
//      #endif
//    phy_adv_params_configure(&adv_config);
   #ifndef STS_MODE
   // set advanced parameters
    struct PHY_ADV_CONFIG_T adv_config = {
        .thres_fap_detect = 40,
        .nth_scale_factor = 4,
        .ranging_performance_mode = 0,
        .skip_weakest_port_en = 0,
    };
      #else
        // set advanced parameters
    struct PHY_ADV_CONFIG_T adv_config = {
        .thres_fap_detect = 40,
        .nth_scale_factor = 4,
        .ranging_performance_mode = 3,
        .skip_weakest_port_en = 0,
    };
      #endif
    phy_adv_params_configure(&adv_config);
//    // uwb configure
//    uwb_configure(config.phy_work_mode, board_param.tx_power_fcc[CALIB_CH(config.phy_cfg.ch_num)], &config.phy_cfg);
//
//      #ifdef STS_MODE
//      ranging_lib_init();
//      #endif
//    ranging_frame_type_set(config.phy_cfg.sts_pkt_cfg);
//
//      #ifdef STS_MODE
//      aoa_aux_info_set(AOA_AUX_ANT_IQ_RSSI_PDOA_AOA_FOM);
//    aoa_steering_vector_set((const float *)((uint32_t)((config.phy_cfg.ch_num == 9) ? svec_ch9_ptr : svec_ch5_ptr) | SRAM_BASE));
    // uwb configure
    uwb_configure(config.phy_work_mode, board_param.tx_power_fcc[CALIB_CH(config.phy_cfg.ch_num)], &config.phy_cfg);
//    aoa_param_config();
//
//      phy_rx_sts_switch_mode_set(config.phy_cfg.sts_pkt_cfg, STS_SWITCH_EVERY_4SYM, 0, 0);
//      #endif
//    // Register rx interrupt callback function
//    mac_register_process_handler(tx_int_callback, rx_int_callback);
//
//    receive_flag = 0;
//    temp_count3=phy_timer_count_get();
//    gpio_pin_set(SCL_PIN);
//      sts_lsp_store();
//    flag_temp2=uwb_rx(0, 0, RX_SYNC_WIN_US_TEMP);//开启接收
//    start_receive_count=phy_timer_count_get();
//    poll_timeout=US_TO_PHY_TIMER_COUNT(2000000);//多一个多0.4ms默认0.4ms计算为0.125*4*100000,默认开启1mss
//    end_receive_count=start_receive_count+poll_timeout;
//    if(end_receive_count>=UINT32_MAX)
//    {
//        end_receive_count-=UINT32_MAX;
//    }
//    current_count=phy_timer_count_get();
//    while(current_count<end_receive_count||current_count>end_receive_count+HALF_SECOND_TIME)//循环接受包体,若为124.8K则是+62400000
//    {
//        while(mac_is_busy())
//        {
//            IdleTask();
//            current_count=phy_timer_count_get();
//            if(current_count>end_receive_count&&current_count<end_receive_count+HALF_SECOND_TIME)
//            {
//                    break;
//            }
//        }
//            sts_lsp_store_stop();
//
//
//        temp_count2=phy_timer_count_get();
//        if(receive_flag==1)//成功接收
//        {
////            if(group_id==rx_buf[GROUP_ID_IDX]&&rx_buf[MESSAGE_TYPE_IDX] == MBX_POLL&&!memcmp(&rx_buf[TAG_ID_IDX],&g_com_map[BIND_DEV_ID],2))//判断是否是和自己是同一组通讯的且为poll包
//            if(group_id==rx_buf[GROUP_ID_IDX]&&rx_buf[MESSAGE_TYPE_IDX] == MBX_POLL)//判断是否是和自己是同一组通讯的且为poll包
//                  {
//                       sleep_timer_start(__MS_TO_32K_CNT(UWB_DELAY_TIME_US-13));//测试
//                        range_timeout_us=20000;//将下次range开启后超时时间设为20ms之后再range里恢复
//                        temp_count2=phy_timer_count_get();
//                frame_seq_nb2 = rx_buf[SEQUENCE_IDX];//获取包序
//                battary = rx_buf[BATTARY_IDX];
//                rec_nearbase_num=rx_buf[FZ_NEARBASENUM_INDEX];  //标签传过来的他与基站交互的基站id数目
//                memcpy(&tag_id_recv,&rx_buf[TAG_ID_IDX],2);
//                memcpy(rec_ancidlist,&rx_buf[FZ_NEARBASEID_INDEX],2*rec_nearbase_num);
//                memcpy(rec_ancdistlist,&rx_buf[FZ_NEARBASEID_INDEX+2*rec_nearbase_num],2*rec_nearbase_num);
//                memcpy(&rec_antdelay,&rx_buf[FZ_NEARBASEID_INDEX+rec_nearbase_num*4],2);
//                for(i=0; i<rec_nearbase_num; i++)
//                {
//                    if(rec_ancidlist[i] == dev_id)
//                    {
//                                    temp_recdist_before_offset=rec_ancdistlist[i];
//                                    rec_ancdistlist[i]+=(int16_t)g_com_map[DIST_OFFSET];
//                        PushAnchorDataArray(tag_id_recv,rec_ancdistlist[i],battary);
//                    }
//                }
//                for(i=0; i<rec_nearbase_num; i++)
//                {
//                    memcpy(&tempid,&rx_buf[FZ_NEARBASEID_INDEX+i*2],2);
//                    if(tempid==dev_id)//也是比id如果有就更新没有就抢占
//                    {
//                        seize_anchor=0;  //非抢占。已存在列表中
//                        Anchor_RecNearPoll(i);
//                        break;
//                    }
//                }
      
      #ifdef STS_MODE
      ranging_lib_init();
      #endif
    ranging_frame_type_set(config.phy_cfg.sts_pkt_cfg);
//                if(i==rec_nearbase_num)
//                {
//                    seize_anchor=1;   //抢占anchor
//                    Anchor_RecNearPoll(i);
//                }
//
//                gpio_pin_clr(SCL_PIN);//测试
//                        LOG_INFO(TRACE_MODULE_APP,"标签ID:%X,距离: %d 信号强度ANT0:%f,信号强度ANT2: %f\r\n",g_com_map[BIND_DEV_ID],distance,sts_rssi[0],sts_rssi[2]);
//                return 1;//返回发送成功标志
//            }
      
      #ifdef STS_MODE
      aoa_aux_info_set(AOA_AUX_ANT_IQ_RSSI_PDOA_AOA_FOM);
    aoa_steering_vector_set((const float *)((uint32_t)((config.phy_cfg.ch_num == 9) ? svec_ch9_ptr : svec_ch5_ptr) | SRAM_BASE));
    aoa_param_config();
      phy_rx_sts_switch_mode_set(config.phy_cfg.sts_pkt_cfg, STS_SWITCH_EVERY_4SYM, 0, 0);
      #endif
    // Register rx interrupt callback function
    mac_register_process_handler(tx_int_callback, rx_int_callback);
    receive_flag = 0;
    temp_count3=phy_timer_count_get();
    gpio_pin_set(SCL_PIN);
      sts_lsp_store();
    flag_temp2=uwb_rx(0, 0, RX_SYNC_WIN_US_TEMP);//开启接收
    start_receive_count=phy_timer_count_get();
    poll_timeout=US_TO_PHY_TIMER_COUNT(2000000);//多一个多0.4ms默认0.4ms计算为0.125*4*100000,默认开启1mss
    end_receive_count=start_receive_count+poll_timeout;
    if(end_receive_count>=UINT32_MAX)
    {
        end_receive_count-=UINT32_MAX;
    }
    current_count=phy_timer_count_get();
    while(current_count<end_receive_count||current_count>end_receive_count+HALF_SECOND_TIME)//循环接受包体,若为124.8K则是+62400000
    {
        while(mac_is_busy())
        {
            IdleTask();
            current_count=phy_timer_count_get();
            if(current_count>end_receive_count&&current_count<end_receive_count+HALF_SECOND_TIME)
            {
                    break;
            }
        }
            sts_lsp_store_stop();
        temp_count2=phy_timer_count_get();
        if(receive_flag==1)//成功接收
        {
//            if(group_id==rx_buf[GROUP_ID_IDX]&&rx_buf[MESSAGE_TYPE_IDX] == MBX_POLL&&!memcmp(&rx_buf[TAG_ID_IDX],&g_com_map[BIND_DEV_ID],2))//判断是否是和自己是同一组通讯的且为poll包
            if(group_id==rx_buf[GROUP_ID_IDX]&&rx_buf[MESSAGE_TYPE_IDX] == MBX_POLL)//判断是否是和自己是同一组通讯的且为poll包
                  {
                       sleep_timer_start(__MS_TO_32K_CNT(UWB_DELAY_TIME_US-13));//测试
                        range_timeout_us=20000;//将下次range开启后超时时间设为20ms之后再range里恢复
                        temp_count2=phy_timer_count_get();
                frame_seq_nb2 = rx_buf[SEQUENCE_IDX];//获取包序
                battary = rx_buf[BATTARY_IDX];
                rec_nearbase_num=rx_buf[FZ_NEARBASENUM_INDEX];  //标签传过来的他与基站交互的基站id数目
                memcpy(&tag_id_recv,&rx_buf[TAG_ID_IDX],2);
                memcpy(rec_ancidlist,&rx_buf[FZ_NEARBASEID_INDEX],2*rec_nearbase_num);
                memcpy(rec_ancdistlist,&rx_buf[FZ_NEARBASEID_INDEX+2*rec_nearbase_num],2*rec_nearbase_num);
                memcpy(&rec_antdelay,&rx_buf[FZ_NEARBASEID_INDEX+rec_nearbase_num*4],2);
                for(i=0; i<rec_nearbase_num; i++)
                {
                    if(rec_ancidlist[i] == dev_id)
                    {
                                    temp_recdist_before_offset=rec_ancdistlist[i];
                                    rec_ancdistlist[i]+=(int16_t)g_com_map[DIST_OFFSET];
                        PushAnchorDataArray(tag_id_recv,rec_ancdistlist[i],battary);
                    }
                }
                for(i=0; i<rec_nearbase_num; i++)
                {
                    memcpy(&tempid,&rx_buf[FZ_NEARBASEID_INDEX+i*2],2);
                    if(tempid==dev_id)//也是比id如果有就更新没有就抢占
                    {
                        seize_anchor=0;  //非抢占。已存在列表中
                        Anchor_RecNearPoll(i);
                        break;
                    }
                }
                if(i==rec_nearbase_num)
                {
                    seize_anchor=1;   //抢占anchor
                    Anchor_RecNearPoll(i);
                }
                gpio_pin_clr(SCL_PIN);//测试
                        LOG_INFO(TRACE_MODULE_APP,"标签ID:%X,距离: %d 信号强度ANT0:%f,信号强度ANT2: %f\r\n",g_com_map[BIND_DEV_ID],distance,sts_rssi[0],sts_rssi[2]);
                return 1;//返回发送成功标志
            }
        }
            temp_count3=phy_timer_count_get();
            sts_lsp_store();
        flag_temp2=uwb_rx(0, 0, RX_SYNC_WIN_US_TEMP);//再次开启接收
    }
      delay_us(2);
      sts_lsp_store_stop();
      uwb_rx_force_off(1);
    // LOG_INFO(TRACE_MODULE_APP,"超时定时器:%x,%x,%x\r\n",start_receive_count,end_receive_count,current_count);
    gpio_pin_clr(SCL_PIN);//测试
    return 0;//返回绑定失败标志
}
//        }
//            temp_count3=phy_timer_count_get();
//            sts_lsp_store();
//        flag_temp2=uwb_rx(0, 0, RX_SYNC_WIN_US_TEMP);//再次开启接收
//    }
//      delay_us(2);
//      sts_lsp_store_stop();
//      uwb_rx_force_off(1);
//    // LOG_INFO(TRACE_MODULE_APP,"超时定时器:%x,%x,%x\r\n",start_receive_count,end_receive_count,current_count);
//    gpio_pin_clr(SCL_PIN);//测试
//    return 0;//返回绑定失败标志
//}
//}
#define SEARCH_TIMESTEMP 20
void UWBPoll(void)
{
    switch(UWB_work_state)
    {
    case LINK_SUCCESS:
    {   //连接成功进行轮询测距
        uwb_led_on();
        UwbRange();
        uwb_led_off();
    }
    break;
    case SEARCH_DEV:
    {
         UWB_work_state=LINK_SUCCESS;
         Uwb_init();
//         //接包不成功或者通讯失败进入搜索模式
//        if(search_open_flag)
//void UWBPoll(void)
//        {
//            LOG_INFO(TRACE_MODULE_APP,"开启搜索\r\n");
//            search_open_flag=0;
//    switch(UWB_work_state)
//    {
//    case LINK_SUCCESS:
//    {   //连接成功进行轮询测距
//            uwb_led_on();
//            link_success_flag=UwbSearch();//第一次开启接收2s绑定失败后则进行下面1分钟后重新开启2s绑定流程
//        UwbRange();
//            uwb_led_off();
//            if(link_success_flag)
//    }
//    break;
//    case SEARCH_DEV:
//    {
//                UWB_work_state=LINK_SUCCESS;
//        }else{
//            LOG_INFO(TRACE_MODULE_APP,"等待进入搜索模式:%d\r\n",SEARCH_TIMESTEMP-uwb_searchcount);
//         Uwb_init();
////         //接包不成功或者通讯失败进入搜索模式
////        if(search_open_flag)
////        {
////            LOG_INFO(TRACE_MODULE_APP,"开启搜索\r\n");
////            search_open_flag=0;
////            uwb_led_on();
////            link_success_flag=UwbSearch();//第一次开启接收2s绑定失败后则进行下面1分钟后重新开启2s绑定流程
////            uwb_led_off();
////            if(link_success_flag)
////                UWB_work_state=LINK_SUCCESS;
////        }else{
////            LOG_INFO(TRACE_MODULE_APP,"等待进入搜索模式:%d\r\n",SEARCH_TIMESTEMP-uwb_searchcount);
////        }
//    }
//    break;
//    case UN_BIND:
//    {
//        uwb_led_off();//关闭uwb指示灯
//    }
//    break;
//    }
//    if(UWB_work_state==LINK_SUCCESS)
//    {   //成功时清0错误计数
//        uwb_searchcount=0;
//    }
//    if(UWB_work_state==SEARCH_DEV)
//    {
//        if(!search_open_flag)
//        {
//            if(uwb_searchcount++>SEARCH_TIMESTEMP)
//            {
//                uwb_searchcount=0;
//                search_open_flag=1;
//            }
//        }
//        //link_error_count+=g_com_map[COM_INTERVAL];
//        //if(link_error_count>=g_com_map[4G_INTERNAL])
//        //link_error_count=0;
//       // update_led_power_state();//更新灯状态
//    }
//     //LOG_INFO(TRACE_MODULE_APP,"UWB状态:%d\r\n",UWB_work_state);
//        }
    }
    break;
    case UN_BIND:
//uint8_t GetUWBBindState(void)
//{
//    if(UWB_work_state == UN_BIND)
//    {
//        return 0;
//    }
//    return 1;
//}
void Tag_App(void)//发送模式(TAG标签)
    {
        uwb_led_off();//关闭uwb指示灯
    }
    break;
    }
    if(UWB_work_state==LINK_SUCCESS)
    {   //成功时清0错误计数
        uwb_searchcount=0;
    }
    if(UWB_work_state==SEARCH_DEV)
    {
        if(!search_open_flag)
        {
            if(uwb_searchcount++>SEARCH_TIMESTEMP)
            {
                uwb_searchcount=0;
                search_open_flag=1;
            }
        }
        //link_error_count+=g_com_map[COM_INTERVAL];
        //if(link_error_count>=g_com_map[4G_INTERNAL])
        //link_error_count=0;
       // update_led_power_state();//更新灯状态
    }
     //LOG_INFO(TRACE_MODULE_APP,"UWB状态:%d\r\n",UWB_work_state);
   //LED0_ON;
//   SPIx_CS_GPIO->BRR = SPIx_CS;
//   delay_us(700);
//   SPIx_CS_GPIO->BSRR = SPIx_CS;
//   id =  dwt_readdevid() ;
//       while (DWT_DEVICE_ID != id)
//    {
//      //   Dw1000_Init();
//         id =  dwt_readdevid() ;
//        IdleTask();
//        if(error_times++>20)
//        {
//            printf("DW ID ERROR.\r\n");
//            SCB->AIRCR = 0X05FA0000|(unsigned int)0x04; //软复位回到bootloader
//        }
//    }
//    error_times = 0;
//    SwitchTagState();
//     userkey_state = !GET_USERKEY;
//   dwt_entersleep();
}
uint8_t GetUWBBindState(void)
{
    if(UWB_work_state == UN_BIND)
    {
        return 0;
    }
    return 1;
}