From b20f94fd39346787a0e99940f0370aae0d84090a Mon Sep 17 00:00:00 2001 From: chen <15335560115@163.com> Date: 星期六, 21 六月 2025 18:18:34 +0800 Subject: [PATCH] 无感闸机基站第一版,增加存授权表和查表逻辑,将接收标签id改为4字节,但是未找到tagupdate直接回将tagnum清0的问题,导致一直抢占 --- keil/uwb_app.c | 86 +++++++++++++++++++++++++++++++++++++++--- 1 files changed, 79 insertions(+), 7 deletions(-) diff --git a/keil/uwb_app.c b/keil/uwb_app.c index 7d8709c..42e12c3 100644 --- a/keil/uwb_app.c +++ b/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; } -- Gitblit v1.9.3