keil/uwb_app.c
@@ -35,10 +35,11 @@
static uint16_t ancidlist_rec[TAG_NUM_IN_SYS],ancidlist_send[TAG_NUM_IN_SYS],rec_ancidlist[TAG_NUM_IN_SYS];
static int16_t rec_ancdistlist[TAG_NUM_IN_SYS];
extern uint8_t group_id;
static uint16_t anc_id_recv,tag_id_recv;
static uint16_t anc_id_recv;
static uint32_t tag_id_recv;
static int16_t rec_antdelay;
extern uint32_t dev_id;
static uint16_t taglist_pos,tmp_time;
static uint32_t taglist_pos,tmp_time;
extern uint16_t tag_frequency;
extern uint16_t disoffset;
static uint8_t frame_len,recpoll_len,current_syncid,new_tagid,seize_anchor,result,g_start_sync_flag;
@@ -47,7 +48,7 @@
//resp函数
void PushAnchorDataArray(uint16_t ancid,int16_t dist,uint8_t battary);//找到自己的id信息对应位置更新自己的交互信息
static void resp_msg_set_ts(uint8_t *ts_field, int64_t ts);//用来对应位置放入时间戳
static uint16_t tagid_list[TAG_NUM_IN_SYS];
static uint32_t tagid_list[TAG_NUM_IN_SYS];
uint16_t CmpTagInList(uint16_t tagid);
uint8_t Anchor_RecNearPoll(uint8_t ancrec_nearbasepos);
static uint8_t send_buffer[100];
@@ -67,6 +68,7 @@
extern uint8_t recev_error_num;
uint8_t uwb_rx_flag;
extern Operation_step UWB_work_state;
void find_in_tag_id_authorization_list(uint32_t authorization_list_num);
extern int16_t first_search_flag;
typedef enum 
{
@@ -461,6 +463,8 @@
//    }
//    anchordata_num=j;
//}
uint8_t find_flag;
extern uint32_t tag_id_authorization_list_num;
void TagListUpdate(void)
{
uint16_t i,j=0,k=0;
@@ -475,6 +479,11 @@
        }
      }
       taglist_num=j;
      if(find_flag)
      {
      find_in_tag_id_authorization_list(tag_id_authorization_list_num);
      find_flag=0;
      }
}
uint8_t position;
@@ -484,7 +493,7 @@
    memcpy(&send_buffer[GROUP_ID_IDX],&group_id,1);//组id
    memcpy(&send_buffer[ANCHOR_ID_IDX],&dev_id,2);//自身id
    memcpy(&send_buffer[TAG_ID_IDX],&tag_id_recv,2);//接受者id
    memcpy(&send_buffer[TAG_ID_IDX],&tag_id_recv,4);//接受者id
    send_buffer[MESSAGE_TYPE_IDX]=MBX_RESPONSE;
//    if(rec_nearbase_num == ancrec_nearbasepos)//抢占模式自己为新基站
@@ -644,6 +653,69 @@
//   }
    UWBIdleTask();
}
uint8_t tag_authorized_List[TAG_NUM_IN_SYS];
extern uint8_t bind_flag;
void bubble_sort(uint32_t *arr, uint32_t n)
{
 if (n <= 1) return;  // 无需排序
    uint32_t i, j;
    uint8_t swapped;  // 标记是否发生交换
    for (i = 0; i < n - 1; i++) {
        swapped = 0;  // 重置交换标记
        // 每轮将最大元素"冒泡"到末尾
        for (j = 0; j < n - i - 1; j++) {
            if (arr[j] > arr[j + 1]) {
                // 交换相邻元素
                uint32_t temp = arr[j];
                arr[j] = arr[j + 1];
                arr[j + 1] = temp;
                swapped = 1;  // 标记发生了交换
            }
        }
        // 优化:如果本轮未发生交换,说明数组已排序
        if (!swapped) break;
    }
}
void copy_taglist_to_flash(void)
{
memcpy(&tag_id_authorization_list,&tagid_list,taglist_num*4);
//进行排序后存入,为二分法做基础
bubble_sort(&tag_id_authorization_list,taglist_num);
save_taglist_map_to_flash();
}
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];
            if (mid_val == target) {
                found = 1;
                break;  // 找到目标值,立即退出循环
            } else if (mid_val < target) {
                left = mid + 1;
            } else {
                right = mid - 1;
            }
        }
        // 存储查找结果
        tag_authorized_List[i] = found;
    }
}
int Anchor_App(void)
{
            uint8_t i;
@@ -657,7 +729,7 @@
            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(&tag_id_recv,&rx_buf[TAG_ID_IDX],4);
            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);
@@ -699,8 +771,8 @@
                                    if(taglist_pos==taglist_num)// taglist_pos==taglist_num 说明这个基站不在当前列表中
                                    {   //tempid==dev_id 说明基站下发测距报文有这个标签的信息
                                          taglist_num++;          //满足上述两种情况才会添加基站ID进入列表中,否则会出现标签不在基站列表中,标签也不响应的情况
                                          tagid_list[taglist_pos] = tag_id_recv;
                                          tagid_list[taglist_pos] = tag_id_recv;//新增基站
                                          find_flag=1;
                                    }
                                    break;
                              }