当前位置: 首页 > news >正文

屏幕显示多级菜单

多次菜单的定义与实现

结构体定义

typedef struct disp_menu_s { const char *name; // 菜单名 const char *desc; // 当前菜单描述 struct disp_menu_s *supmenus; // 上级菜单列表 size_t supmenu_count; // 上级菜单数量 struct disp_menu_s *submenus; // 子菜单列表 size_t submenu_count; // 子菜单数量 esp_err_t (*action)(void *arg); // 菜单执行函数 void *arg; // 函数执行参数 } disp_menu_t;

定义菜单的菜单名和描述,指明上级菜单的位置,上次菜单同级的菜单数量,下级菜单列表的位置,与下级菜单数量,当前的菜单是否关联回调执行函数,与回调函数的入参参数

具体的菜单声明

  • 以小车遥控器代码示例
disp_menu_t check_menu[] = { {"bond_disp", "bond display", settings_menu, 3, NULL, 0, NULL, NULL}, }; disp_menu_t settings_menu[] = { {"check_disp", "check display", main_menu, 2, check_menu, 1, check_devices, NULL}, {"unbond_disp", "unbond display", main_menu, 2, NULL, 0, unbind_device, NULL}, {"reset", "reset device", main_menu, 2, NULL, 0, NULL, NULL}, }; disp_menu_t main_menu[] = { {"default_disp", "default display", NULL, 0, NULL, 0, NULL, NULL}, {"setting_disp", "setting display", NULL, 0, settings_menu, 3, NULL, NULL}, };

其中check_menu下的bond_disp菜单存在子菜单,但是当前赋值为空(NULL, 0),具体的分配区域需要在进入check_menu菜单时通过check_devices去实现内容分配和指针重新指向一个有数据的地址并修改具体的数据

  • 具体的后续菜单的分配与修改
for (int i = 0; i < cJSON_GetObjectItem(root, "device_len")->valueint; i++) { cJSON *item = cJSON_GetArrayItem(cJSON_GetObjectItem(root, "data"), i); if (item) { cJSON *idx = cJSON_GetObjectItem(item, "idx"); cJSON *name = cJSON_GetObjectItem(item, "name"); cJSON *mac = cJSON_GetObjectItem(item, "mac"); dev_list[i].idx = idx->valueint; itoa(dev_list[i].idx, dev_list[i].idxs, 10); sprintf(dev_list[i].name, name->valuestring); sprintf(dev_list[i].mac, mac->valuestring); dev_list_menu[i].name = dev_list[i].mac; dev_list_menu[i].desc = dev_list[i].name; dev_list_menu[i].supmenus = check_menu; dev_list_menu[i].supmenu_count = 3; dev_list_menu[i].submenus = NULL; dev_list_menu[i].submenu_count = 0; dev_list_menu[i].action = bind_device; dev_list_menu[i].arg = dev_list[i].mac; } } check_menu[0].submenus = dev_list_menu; check_menu[0].submenu_count = cJSON_GetObjectItem(root, "device_len")->valueint;

实现了对空菜单的修改与重新赋值

对菜单路径的访问

  • 当前菜单所在位置的记录
disp_menu_t *curr_menu = main_menu; int curr_menu_len = 2; int cursor = 0;
  • curr_menu指明当前所在菜单位置
  • curr_menu_len指明当前菜单的子菜单目录长度
  • cursor指明当前选中了哪个子菜单
  • 进入下一级菜单
if (evt.key_val.key_fsm_finished) { if (curr_menu[cursor].action != NULL) { if (curr_menu[cursor].action(curr_menu[cursor].arg) != ESP_OK) { ESP_LOGI(__func__, "menu: %s action false", curr_menu[cursor].desc); } else { ESP_LOGI(__func__, "menu: %s action true", curr_menu[cursor].desc); } } if (curr_menu[cursor].submenus != NULL) { curr_menu_len = curr_menu[cursor].submenu_count; curr_menu = curr_menu[cursor].submenus; cursor = 0; } }
  1. 首先判断是否需要执行回调函数
  2. 切换进入下级目录

**需要确保函数对目录的进入不会有影响,否则应该调整函数执行失败的策略**

  • 返回上一级菜单
if (evt.key_val.key_fsm_finished) { if (curr_menu->supmenus != NULL) { cursor = 0; curr_menu_len = curr_menu[cursor].supmenu_count; curr_menu = curr_menu[cursor].supmenus; } else // joycon defalut display { disp_mode = 0; cursor = 0; curr_menu_len = 2; curr_menu = main_menu; } }

通过当前菜单列表的父指针获取当前列表,并且父指针的菜单结构体中存在当前菜单列表的数量,可以准确的获取菜单列表长度

http://www.jsqmd.com/news/1246506/

相关文章:

  • 2026年7月博世洗衣机售后服务电话24小时全新专属热线升级公示最新公告 - 家电技术百科
  • 电力负荷预测基准测试:时间序列Transformer模型表现超越传统方法
  • Linux 极速文本搜索:fgrep 命令详解 —— 纯字符串匹配神器
  • EGO数采数据处理Pipeline全解析:从采集到训练的完整技术栈
  • 淮安除甲醛公司收费大公开:金耀环境与连锁品牌性价比实测 - CMA甲醛检测中心
  • 黔西除甲醛公司收费大公开:金耀环境与连锁品牌性价比实测 - CMA甲醛检测中心
  • TMS470R1x ADC自检模式:原理、配置与工程实践
  • 2026年7月欧米茄合肥客户服务与售后地址及热线电话最新公示 - 欧米茄服务中心
  • 2026年7月松下(Panasonic)空调售后服务电话24小时全新专属热线电话升级公示最新说明 - 每日头条更新
  • 绥化除甲醛公司收费大公开:金耀环境与连锁品牌性价比实测 - CMA甲醛检测中心
  • 黔东除甲醛公司收费大公开:金耀环境与连锁品牌性价比实测 - CMA甲醛检测中心
  • B站技术视频标题优化:从搜索算法到点击率提升的完整方法论
  • 美联储金融数据自动化处理:开源工具链架构与实践指南
  • 2026 年更新:泸溪比较好的无机纤维棉喷涂施工生产厂家推荐,揭秘!这种喷涂技术如何颠覆传统隔热难题 - 行业推荐官【认证】
  • 湘西除甲醛公司收费大公开:金耀环境与连锁品牌性价比实测 - CMA甲醛检测中心
  • 快消品新品上市管理如何告别延期?——核心问题与未来3年趋势
  • 白城除甲醛公司收费大公开:金耀环境与连锁品牌性价比实测 - CMA甲醛检测中心
  • 卡地亚中国售后服务中心|服务热线及完整地址权威信息通告(2026年7月更新) - 卡地亚官方售后中心
  • Unity对话系统进阶:从传统对话树到电影级互动叙事开发
  • AI Agent核心原理技术笔记(LLM+上下文+工具体系)(AI Agent学习基础)(李博杰《深入理解 AI Agent》1.1观后总结)
  • 加班被丈夫赶出家门,HR 辞退我,只因分不清 LambdaQueryWrapper 和 BaseMapper
  • LangChain Prompt 模板保姆级教程:让大模型秒懂你的心
  • 其实我们的知识竞赛也能做出电视节目的质感
  • 医疗医患纠纷场景评测|魔珐星云职场法务数字人线下咨询实测
  • 营销避坑指南:如何通过GEO发稿平台绕开90%的无效营销损耗
  • TM4C1294定时器GPTM实战:从CRC校验到PWM、输入捕获应用
  • Godot项目构建全流程解析:从导出预设到多平台部署实战
  • 工业时序数据库怎么选?多模融合架构实战,附写入性能与压缩比实测
  • 便携式ORP分析仪的产品功能分析
  • 2026年镇远美食避雷指南:用服务参数锁定好餐厅 - 万相科技