优秀代码段案例__笔记

一、关于协议报警部分

如果想让一种情况只触发一次,可以增加一个新的标志位例如,在条件成立时赋值,复位后清空

bool status_pack_arr[32] = {false}; // 用于标记是否处理过报警

但是如果是上位机去读这种状态,需要再次进来这种状态,那么就需要走else if()

然后在else if加一些限制条件和要传送的值

二、下拉部件 的优化操作,适合多索引值

cpp 复制代码
    static char* generate_sequence(int max) {
    int size = (max + 1) * 4; // 每个数字最多占用3个字符加上一个换行符  max+1是从0-max
    char *str = malloc(size + 1); // 分配足够的内存
    if (str == NULL) {
        return NULL; // 内存分配失败
    }
    char *ptr = str;//这样返回的字符串还是从开始的地址开始str不受印象  使用ptr进行移动
    for (int i = 0; i < max; i++) {
        ptr += sprintf(ptr, "%d\n", i); // 将数字和换行符写入字符串
    }
    for (int i = max; i <= max; i++) {
        ptr += sprintf(ptr, "%d", i); // 将数字和换行符写入字符串
    }
    return str;
    }


    const char *text2[5];
    text2[0] = generate_sequence(120);
    text2[1] = generate_sequence(10);
    text2[2] = generate_sequence(120);
    text2[3] = generate_sequence(10);
    text2[4] = generate_sequence(120);



    // 释放分配的内存
    free((char*)text2[0]);
    free((char*)text2[1]);
    free((char*)text2[2]);
    free((char*)text2[3]);
    free((char*)text2[4]);

三、多个相似变量的统一管理

如果有些变量的控制方式一样,方便统一管理,可以使用数组

cpp 复制代码
bool conditions[] = {
            user_io.RELAY.v1,
            user_io.RELAY.v2,
            user_io.RELAY.v3,
            user_io.RELAY.r1,
            user_io.RELAY.r2,
            user_io.RELAY.r3,
            user_io.RELAY.r4,
            user_io.RELAY.r5,
            user_io.RELAY.r6,
            user_io.in1,
            user_io.in2,
        };

四、LVGL中点击后,提示对应的内容

cpp 复制代码
因为需要上电后再次更新显示,所以需要存储对应的标签,然后定时刷新
static void updateDevInfo(struct _lv_timer_t *p)
{
    // 假设 readPara 是用来从 flash 读取配置的函数
    getPara(sys_config, &sysparam.config);

    if (sysparam.config.init_pack_cu == 1) {
        // 如果配置已初始化,按保存的数据更新标签显示
        for (int i = 0; i < 12; i++) {
            if (sysparam.config.cluster_config[i].is_set) {
                char label_text[64];

                // 更新并显示簇完成状态标签
                sprintf(label_text, "簇%d完成,", i + 1);
                lv_label_set_text(win_pack_cu.label_pack1[i], label_text);
                lv_obj_clear_flag(win_pack_cu.label_pack1[i], LV_OBJ_FLAG_HIDDEN);

                // 更新并显示探测器数量标签
                sprintf(label_text, "PACK数量%d", sysparam.config.cluster_config[i].detector_count);
                lv_label_set_text(win_pack_cu.label_pack2[i], label_text);
                lv_obj_clear_flag(win_pack_cu.label_pack2[i], LV_OBJ_FLAG_HIDDEN);
            }
        }
    } else {
        // 如果未初始化,隐藏所有标签
        for (int i = 0; i < 12; i++) {
            lv_obj_add_flag(win_pack_cu.label_pack1[i], LV_OBJ_FLAG_HIDDEN);
            lv_obj_add_flag(win_pack_cu.label_pack2[i], LV_OBJ_FLAG_HIDDEN);
        }
    }
}

因为按下按钮,从下拉列表中取数据,然后存储,以及弹出对应的标签显示
static void btn_event_cb(lv_event_t *e)
{
    lv_obj_t *target = lv_event_get_target(e);
    lv_event_code_t code = lv_event_get_code(e);

    if (code == LV_EVENT_CLICKED) //按下
    {
        uint8_t total_clusters = lv_dropdown_get_selected(win_pack_cu.dd[0]) + 5;  // 加5因为序号从5开始
        uint8_t selected_cluster = lv_dropdown_get_selected(win_pack_cu.dd[1]) + 1;    // 选择的簇
        uint8_t detectors_count = lv_dropdown_get_selected(win_pack_cu.dd[2]) + 1; // 加1因为序号从1开始
        
                // 更新系统配置
        sysparam.config.cu_num = total_clusters;
        sysparam.config.init_pack_cu = 1;
        sysparam.config.cluster_config[selected_cluster-1].is_set = true;//0表示第一簇
        sysparam.config.cluster_config[selected_cluster-1].detector_count = detectors_count;//先判断addr地址是否为1  然后判断cluster_config[0].detector_count探测器数量
        savePara(sys_config, &sysparam.config);
        
        // 确保选择的簇号不超过总簇数
        if (selected_cluster <= total_clusters)
        {
            // 更新标签文本和显示标签
            char label_text[64];
            sprintf(label_text, "簇%d完成,", selected_cluster);  // 簇号从1开始
            lv_label_set_text(win_pack_cu.label_pack1[selected_cluster-1], label_text);
            lv_obj_clear_flag(win_pack_cu.label_pack1[selected_cluster-1], LV_OBJ_FLAG_HIDDEN);

            sprintf(label_text, "PACK数量%d", detectors_count);
            lv_label_set_text(win_pack_cu.label_pack2[selected_cluster-1], label_text);
            lv_obj_clear_flag(win_pack_cu.label_pack2[selected_cluster-1], LV_OBJ_FLAG_HIDDEN);
        }
    }
}
清除所有的标签显示
static void btnclr_event_cb(lv_event_t *e)
{
    lv_obj_t *target = lv_event_get_target(e);
    lv_event_code_t code = lv_event_get_code(e);
    
    if (code == LV_EVENT_CLICKED) //按下
    {
        sysparam.config.init_pack_cu = 0;
        memset(sysparam.config.cluster_config, 0, sizeof(sysparam.config.cluster_config));
        // 保存配置到 flash
        savePara(sys_config, &sysparam.config);
        for(int i = 0; i < 12; i++)
        {
            lv_obj_add_flag(win_pack_cu.label_pack1[i], LV_OBJ_FLAG_HIDDEN);
            lv_obj_add_flag(win_pack_cu.label_pack2[i], LV_OBJ_FLAG_HIDDEN);
        }
    }
}

五、字符转int,转double

cpp 复制代码
#include <stdio.h>

int main() {
    // 定义一个char类型的变量并初始化
    char c = 'A';
    // 将char转换为int
    int ascii_value = c;
    // 输出结果
    printf("The ASCII value of %c is %d\n", c, ascii_value);
    
    // 使用其他字符
    c = '0';  // 数字字符'0'
    ascii_value = c;  // 隐式转换到int
    printf("The ASCII value of %c is %d\n", c, ascii_value);
    
    c = ';';  // 符号';'
    ascii_value = c;  // 隐式转换到int
    printf("The ASCII value of %c is %d\n", c, ascii_value);
    
    return 0;
}
相关推荐
zhglhy6 分钟前
随机森林与决策树
算法·决策树·随机森林
BFT白芙堂31 分钟前
Franka 机器人x Dexterity Gen引领遥操作精细任务新时代
人工智能·算法·机器学习·具身智能·franka机器人·科研机器人·机器人解决方案
LuckyLay39 分钟前
LeetCode算法题(Go语言实现)_38
算法·leetcode·golang
放羊大亨1 小时前
《认知觉醒》下篇·第六章第一节“清晰:一个观念,重构你的行动力” 总结
笔记
Chiyamin1 小时前
图算法基础
数据结构·c++·算法
C——Coder1 小时前
关于柔性数组
算法·柔性数组
AlgoNewbie1 小时前
牛客周赛 Round 88【题解完成】
算法
小白探索世界欧耶!~1 小时前
【踩坑】GitHub Actions 运行的 Linux 环境中,文件名是大小写敏感的
linux·运维·服务器·前端·vue.js·笔记·github
luckycoding2 小时前
2747. 统计没有收到请求的服务器数目
算法
0x4082 小时前
数据结构--线性表&顺序表示(上)
数据结构·笔记