| | |
| | | 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; |
| | |
| | | //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]; |
| | |
| | | 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 |
| | | { |
| | |
| | | // } |
| | | // 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; |
| | |
| | | } |
| | | } |
| | | taglist_num=j; |
| | | if(find_flag) |
| | | { |
| | | find_in_tag_id_authorization_list(tag_id_authorization_list_num); |
| | | find_flag=0; |
| | | } |
| | | } |
| | | |
| | | uint8_t position; |
| | |
| | | |
| | | 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)//抢占模式自己为新基站 |
| | |
| | | // } |
| | | 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; |
| | |
| | | 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); |
| | |
| | | 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; |
| | | } |