Customized Report List Control with In-Place Combo Box '& Edit Control

本文介绍如何在C++中利用ListView控件实现报告视图,并提供了一系列实用的技巧与方法,帮助开发者更好地掌握ListView控件的应用。
你提供的代码段是典型的 **设备树属性解析逻辑**,用于根据设备树中是否定义了 `cust-sensor` 属性来决定如何加载支持的传感器列表(sensor list)。 --- ## 📌 问题分析 你给出的代码片段如下: ```c ret = of_property_read_string(of_node, "cust-sensor", &penable_sensor); if (ret < 0) { PK_DBG("Property cust-sensor not defined\n"); while (psensor_list->id && i < MAX_NUM_OF_SUPPORT_SENSOR) { pimgsensor->psensor_list[i] = psensor_list; i++; psensor_list++; } } else { PK_DBG("Customized sensors: %s\n", penable_sensor); while (psensor_list->id && i < MAX_NUM_OF_SUPPORT_SENSOR) { if (strstr(penable_sensor, psensor_list->name)) { pimgsensor->psensor_list[i] = psensor_list; i++; } psensor_list++; } } ``` 这段代码的核心逻辑是: - 如果设备树节点中没有定义 `"cust-sensor"` 属性,则将所有支持的传感器加入到 `pimgsensor->psensor_list[]`。 - 如果有定义 `"cust-sensor"`,则只将名称出现在该字符串中的传感器加入列表。 --- ## ✅ 逐行解释 ### 1. 读取设备树属性 ```c ret = of_property_read_string(of_node, "cust-sensor", &penable_sensor); ``` - 使用 `of_property_read_string()` 从设备树节点 `of_node` 中读取名为 `"cust-sensor"` 的字符串属性。 - 返回值为 `0` 表示成功,非 0 表示失败(如属性不存在、不是字符串等)。 - 成功时,`penable_sensor` 指向设备树中定义的字符串内容。 --- ### 2. 处理属性不存在的情况 ```c if (ret < 0) { PK_DBG("Property cust-sensor not defined\n"); while (psensor_list->id && i < MAX_NUM_OF_SUPPORT_SENSOR) { pimgsensor->psensor_list[i] = psensor_list; i++; psensor_list++; } } ``` - 如果 `"cust-sensor"` 未在设备树中定义,说明使用默认配置,即将所有传感器加入列表。 - `while` 循环遍历 `psensor_list`,直到遇到 `id == 0` 或达到最大数量限制 `MAX_NUM_OF_SUPPORT_SENSOR`。 - 每个有效的传感器指针被保存进 `pimgsensor->psensor_list[i]`。 --- ### 3. 处理属性存在的情况 ```c else { PK_DBG("Customized sensors: %s\n", penable_sensor); while (psensor_list->id && i < MAX_NUM_OF_SUPPORT_SENSOR) { if (strstr(penable_sensor, psensor_list->name)) { pimgsensor->psensor_list[i] = psensor_list; i++; } psensor_list++; } } ``` - 如果 `"cust-sensor"` 存在,则将其值作为启用传感器的白名单。 - 使用 `strstr()` 查找当前传感器名是否包含在 `penable_sensor` 字符串中。 - 如果匹配,则将其加入 `pimgsensor->psensor_list[i]`。 > ⚠️ 注意:这种方式依赖于字符串包含判断,因此要确保传感器名字不会出现子集冲突。例如 `"ov5640"` 和 `"ov5640a"` 可能会误判。 --- ## 🔍 示例设备树配置 ```dts camera { compatible = "mediatek,camera"; cust-sensor = "ov5640 imx219"; }; ``` 在这种情况下: - `penable_sensor` 值为 `"ov5640 imx219"` - 遍历时只会将名字为 `"ov5640"` 或 `"imx219"` 的传感器加入列表。 --- ## 🧩 更健壮的做法建议 目前的实现虽然有效,但 `strstr()` 判断方式不够严谨,可能会误匹配。更安全的方式是按空格分隔字符串进行比较: ```c #include <linux/string.h> char sensor_name[32]; const char *p = penable_sensor; while (*p != '\0' && i < MAX_NUM_OF_SUPPORT_SENSOR) { const char *end = strchr(p, ' '); int len = end ? end - p : strlen(p); if (len >= sizeof(sensor_name)) break; memcpy(sensor_name, p, len); sensor_name[len] = '\0'; psensor_list = sensor_list; // reset to head while (psensor_list->id) { if (strcmp(psensor_list->name, sensor_name) == 0) { pimgsensor->psensor_list[i++] = psensor_list; break; } psensor_list++; } p += len + (end != NULL); // skip space } ``` 这样可以精确匹配每个传感器名,避免模糊匹配的问题。 --- ## ❗ 常见错误与注意事项 | 错误 | 原因 | |------|------| | `penable_sensor` 为空或非法地址 | 忘记检查 `of_property_read_string()` 的返回值 | | 匹配不到传感器 | `cust-sensor` 字符串拼写错误或大小写不一致 | | 段错误 | `psensor_list` 没有正确初始化或越界访问 | | 重复添加传感器 | 没有防止同一个传感器多次加入列表 | --- ## ✅ 总结 这段代码实现了基于设备树配置动态选择可用传感器的功能: - 若无定制配置,使用默认全部传感器; - 若有 `"cust-sensor"` 字符串属性,则只启用其中列出的传感器; - 使用 `strstr()` 实现模糊匹配,但在实际工程中建议改为精确匹配。 --- ##
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值