if(temp1<0.001){ // memset(str, 0, 17); sprintf((char *)str,"voltage: %1.3f V ~1%%",temp1); lcd_show_string(50,130,350,30,32,str,RED); } else if(temp1>0.001 && temp1<0.01){ // memset(str, 0, 17); sprintf((char *)str,"voltage: %1.2f V ~1%%",temp1); lcd_show_string(50,130,350,30,32,str,RED); } else if(temp1>0.01 && temp1<0.1){ // memset(str, 0, 17); sprintf((char *)str,"voltage: %1.1f V ~1%%",temp1); lcd_show_string(50,130,350,30,32,str,RED); } else if(temp1>0.1){ // memset(str, 0, 17); sprintf((char *)str,"voltage: %1.1f V ~1%%",temp1); lcd_show_string(50,130,350,30,32,str,RED); } g_adc_dma_sta = 0; adc_dma_enable(ADC_DMA_BUF_SIZE); } } }
时间: 2023-12-06 13:44:12 浏览: 123
这段代码是在处理ADC采集电压的结果,并将结果显示在LCD屏幕上。代码首先通过一系列的 if-else 判断,确定电压值的范围,然后使用 sprintf 函数将电压值格式化为一个字符串,最后调用 lcd_show_string 函数将字符串显示在屏幕上。在代码的最后,将 g_adc_dma_sta 变量设置为0,并重新启用ADC的DMA模式进行下一次采集。
相关问题
sprintf(bl,"select * from menu where name = '%s'",s2.name); int ra = sqlite3_exec(db,bl,callback,NULL,&errmsg1);int callback(void * data,int colum_num,char * colum_value[],char * colum_name[]) { int i = 0; fod s1; char buf[100]; memset(&s1,0,sizeof(s1)); //memset(allbuf,0,sizeof(allbuf)); memset(buf,0,sizeof(buf)); s1.id = atoi(colum_value[0]); strcpy(s1.name,colum_value[1]); s1.price = atoi(colum_value[2]); sprintf(buf,"%d\t%s\t%d\t",s1.id,s1.name,s1.price); strcat(allbuf,buf); printf("\n"); return 0; }
这段代码是在使用 SQLite 数据库查询菜单信息,根据菜名查询具体菜品的 ID、名称和价格,并将查询结果存放在结构体 s1 中,然后将 s1 中的信息格式化到 buf 中,再将 buf 追加到 allbuf 中。最后通过回调函数返回查询结果。其中,sprintf() 函数用于格式化字符串,atoi() 函数用于将字符串转换为整数,strcpy() 函数用于将字符串复制到另一个字符串中,strcat() 函数用于将一个字符串追加到另一个字符串的末尾。
对上述代码进行如下修改,是否改变基本功能:tatic int process(int8_t* input, int point_cnt, int height, int width, int stride, std::vector<float>& boxes, std::vector<float>& objProbs, std::vector<int>& classId, float threshold, int32_t zp, float scale) { int validCount = 0; float thres = unsigmoid(threshold); int8_t thres_i8 = qnt_f32_to_affine(thres, zp, scale); for (int a = 0; a < point_cnt; a++){ int8_t maxClassProbs = 0; int maxClassId = 0; for (int k = 1; k < OBJ_CLASS_NUM; ++k) { int8_t prob = input[(3+k) * point_cnt + a]; if (prob > maxClassProbs) { maxClassId = k; maxClassProbs = prob; } } if (maxClassProbs >= thres_i8) { int8_t rx = input[0 * point_cnt + a]; int8_t ry = input[1 * point_cnt + a]; int8_t rw = input[2 * point_cnt + a]; int8_t rh = input[3 * point_cnt + a]; float box_x = sigmoid(deqnt_affine_to_f32(rx, zp, scale)) * 2.0 - 0.5; float box_y = sigmoid(deqnt_affine_to_f32(ry, zp, scale)) * 2.0 - 0.5; float box_w = sigmoid(deqnt_affine_to_f32(rw, zp, scale)) * 2.0; float box_h = sigmoid(deqnt_affine_to_f32(rh, zp, scale)) * 2.0; objProbs.push_back(sigmoid(deqnt_affine_to_f32(maxClassProbs, zp, scale))); classId.push_back(maxClassId); validCount++; boxes.push_back(box_x); boxes.push_back(box_y); boxes.push_back(box_w); boxes.push_back(box_h); } } return validCount; } int post_process(int8_t* input0, int model_in_h, int model_in_w, float conf_threshold, float nms_threshold, float scale_w, float scale_h, std::vector<int32_t>& qnt_zps, std::vector<float>& qnt_scales, detect_result_group_t* group) { static int init = -1; if (init == -1) { int ret = 0; ret = loadLabelName(LABEL_NALE_TXT_PATH, labels); if (ret < 0) { return -1; } init = 0; } memset(group, 0, sizeof(detect_result_group_t)); std::vector<float> filterBoxes; std::vector<float> objProbs; std::vector<int> classId; // stride 6 int stride0 = 4 + OBJ_CLASS_NUM; int point_cnt = 8400; int validCount0 = 0; validCount0 = process(input0, point_cnt, model_in_h, model_in_w, stride0, filterBoxes, objProbs, classId, conf_threshold, qnt_zps[0], qnt_scales[0]); int validCount = validCount0; // no object detect if (validCount <= 0) { return 0; } std::vector<int> indexArray; for (int i = 0; i < validCount; ++i) { indexArray.push_back(i); } quick_sort_indice_inverse(objProbs, 0, validCount - 1, indexArray); std::set<int> class_set(std::begin(classId), std::end(classId)); for (auto c : class_set) { nms(validCount, filterBoxes, classId, indexArray, c, nms_threshold); } int last_count = 0; group->count = 0; /* box valid detect target */ for (int i = 0; i < validCount; ++i) { if (indexArray[i] == -1 || last_count >= OBJ_NUMB_MAX_SIZE) { continue; } int n = indexArray[i]; float x1 = filterBoxes[n * 4 + 0]; float y1 = filterBoxes[n * 4 + 1]; float x2 = x1 + filterBoxes[n * 4 + 2]; float y2 = y1 + filterBoxes[n * 4 + 3]; int id = classId[n]; float obj_conf = objProbs[i]; group->results[last_count].box.left = (int)(clamp(x1, 0, model_in_w) / scale_w); group->results[last_count].box.top = (int)(clamp(y1, 0, model_in_h) / scale_h); group->results[last_count].box.right = (int)(clamp(x2, 0, model_in_w) / scale_w); group->results[last_count].box.bottom = (int)(clamp(y2, 0, model_in_h) / scale_h); group->results[last_count].prop = obj_conf; char* label = labels[id]; strncpy(group->results[last_count].name, label, OBJ_NAME_MAX_SIZE); // printf("result %2d: (%4d, %4d, %4d, %4d), %s\n", i, group->results[last_count].box.left, // group->results[last_count].box.top, // group->results[last_count].box.right, group->results[last_count].box.bottom, label); last_count++; } group->count = last_count; return 0; }
对于第一个修改的代码块 `static int process(int8_t* input, int point_cnt, int height, int width, int stride,
std::vector<float>& boxes, std::vector<float>& objProbs, std::vector<int>& classId, float threshold,
int32_t zp, float scale)`,基本功能并没有改变。该函数仍然实现了目标检测的后处理,根据输入的 int8_t 类型指针和相关参数,提取有效的目标检测结果,并将检测框的位置、大小、目标置信度和类别编号存储在相应的向量中。
第二个修改的代码块 `int post_process(int8_t* input0, int model_in_h, int model_in_w, float conf_threshold,
float nms_threshold, float scale_w, float scale_h, std::vector<int32_t>& qnt_zps,
std::vector<float>& qnt_scales, detect_result_group_t* group)`,基本功能也没有改变。该函数仍然实现了目标检测的后处理,根据输入的特征图和相关参数,提取有效的目标检测结果,并将检测框的位置、大小、目标置信度和类别信息存储在 `detect_result_group_t` 结构体中。
两个修改的代码块主要对输入参数进行了调整,其中 `point_cnt` 表示检测点的数量,通过调整 `stride0` 的计算方式来确定。这些修改可能是为了适应不同的检测模型或数据集,但并没有改变基本的目标检测后处理逻辑。
阅读全文