keil/uwb_app.c
@@ -449,7 +449,7 @@
        ts2 >>= 8;
    }
}
uint8_t tt5=0;
//void TagListUpdate(void)
//{
//    uint8_t i,j=0;
@@ -481,6 +481,7 @@
       taglist_num=j;
      if(find_flag)
      {
//         if(tt5)
      find_in_tag_id_authorization_list(tag_id_authorization_list_num);
      find_flag=0;
      }
@@ -690,30 +691,65 @@
void find_in_tag_id_authorization_list(uint32_t authorization_list_num)
{
 for (uint32_t i = 0; i < taglist_num; i++) {
        uint32_t target = tagid_list[i];
        uint32_t left = 0;
        uint32_t right = authorization_list_num - 1;  // 授权列表的最大索引
        uint8_t found = 0;
        // 二分查找循环
        while (left <= right) {
            uint32_t mid = left + ((right - left) >> 1);  // 防止整数溢出
            uint32_t mid_val = tag_id_authorization_list[mid];
// for (uint32_t i = 0; i < taglist_num; i++) {
//        uint32_t target = tagid_list[i];
//        uint32_t left = 0;
//        uint32_t right = authorization_list_num - 1;  // 授权列表的最大索引
//        uint8_t found = 0;
//
//        // 二分查找循环
//        while (left <= right) {
//            uint32_t mid = left + ((right - left) >> 1);  // 防止整数溢出
//            uint32_t mid_val = tag_id_authorization_list[mid];
//
//            if (mid_val == target) {
//                found = 1;
//                break;  // 找到目标值,立即退出循环
//            } else if (mid_val < target) {
//                left = mid + 1;
//            } else {
//                right = mid - 1;
//            }
//                   LOG_INFO(TRACE_MODULE_APP, "DEBUG: i=%u, left=%d, right=%d, found=%u\n", i, left, right, found);
//        }
////
////        // 存储查找结果
////        tag_authorized_List[i] = found;
//    }
{
    // 如果授权列表为空,直接全部标记为0
    if (authorization_list_num == 0) {
        for (int i = 0; i < taglist_num; i++) {
            tag_authorized_List[i] = 0;
        }
        return;
    }
    // 遍历需要查找的每个ID
    for (int i = 0; i < taglist_num; i++) {
        int key = tagid_list[i];
        int low = 0;
        int high = authorization_list_num - 1;
        int found = 0; // 标记是否找到
        // 在授权列表中执行二分查找
        while (low <= high) {
            int mid = low + (high - low) / 2; // 防止整数溢出
            
            if (mid_val == target) {
                found = 1;
                break;  // 找到目标值,立即退出循环
            } else if (mid_val < target) {
                left = mid + 1;
            if (tag_id_authorization_list[mid] == key) {
                found = 1; // 找到匹配项
                break;
            } else if (tag_id_authorization_list[mid] < key) {
                low = mid + 1; // 在右半部分继续查找
            } else {
                right = mid - 1;
                high = mid - 1; // 在左半部分继续查找
            }
        }
        // 存储查找结果
        tag_authorized_List[i] = found;
        // 根据查找结果设置输出列表
        tag_authorized_List[i] = found ? 1 : 0;
    }
}
}
int Anchor_App(void)
@@ -765,9 +801,19 @@
                              memcpy(&tempid,&rx_buf[FZ_NEARBASEID_INDEX+i*2],2);
                              if(tempid==dev_id)
                              {
                                    Anchor_RecNearPoll(i);
                                    tagdist_list[taglist_pos]=rec_ancdistlist[i];
                                    anchordata_bat[taglist_pos] = battary;//保存该基站电量
                                 if(tag_authorized_List[taglist_pos]==1)
                                 {
                                    if(tagdist_list[taglist_pos]<100)
                                    {
                                    gpio_pin_set(BUTTON_PIN);
                                    }else{
                                    gpio_pin_clr(BUTTON_PIN);
                                    }
                                 }
                                    if(taglist_pos==taglist_num)// taglist_pos==taglist_num 说明这个基站不在当前列表中
                                    {   //tempid==dev_id 说明基站下发测距报文有这个标签的信息
                                          taglist_num++;          //满足上述两种情况才会添加基站ID进入列表中,否则会出现标签不在基站列表中,标签也不响应的情况