Files
menu/api/menu.h
2025-12-18 21:24:20 +08:00

152 lines
4.9 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/**
* @file menu.h
* @brief 菜单组件对外暴露的核心接口(用户唯一需要包含的头文件)
* @note 工业级嵌入式菜单组件 - 对外API层
*/
#ifndef MENU_H
#define MENU_H
#include "menu_config.h"
#include <stdint.h>
#include <stdbool.h>
/************************** 全局类型导出 **************************/
/**
* @brief 菜单错误码(工业级错误处理:明确所有可能的错误类型)
*/
typedef enum {
MENU_OK = 0, ///< 操作成功
MENU_ERR_INVALID_PARAM, ///< 无效参数
MENU_ERR_OUT_OF_MEMORY, ///< 内存不足(静态内存池已满)
MENU_ERR_NODE_NOT_FOUND, ///< 菜单节点未找到
MENU_ERR_STACK_OVERFLOW, ///< 菜单栈溢出(导航层级超过配置)
MENU_ERR_STACK_UNDERFLOW, ///< 菜单栈下溢(已到根节点仍返回)
MENU_ERR_EVENT_QUEUE_FULL, ///< 事件队列已满
MENU_ERR_NOT_SUPPORTED, ///< 功能未启用(如未开启多语言)
MENU_ERR_HW_PORT_ERROR ///< 硬件端口层错误
} MenuErrCode;
/**
* @brief 菜单事件类型(事件驱动核心:解耦按键与菜单逻辑)
*/
typedef enum {
MENU_EVENT_NONE = 0, ///< 无事件
MENU_EVENT_KEY_UP, ///< 上键按下
MENU_EVENT_KEY_DOWN, ///< 下键按下
MENU_EVENT_KEY_ENTER, ///< 确认键按下
MENU_EVENT_KEY_BACK, ///< 返回键按下
MENU_EVENT_CUSTOM_BEGIN = 0x10, ///< 自定义事件起始标识(用户可扩展)
} MenuEventType;
/**
* @brief 菜单节点ID类型统一标识
*/
typedef uint16_t MenuNodeId;
/**
* @brief 菜单回调函数类型(菜单选中/退出时的执行逻辑)
* @param node_id 触发回调的菜单节点ID
* @return 错误码
*/
typedef MenuErrCode (*MenuCallback)(MenuNodeId node_id);
/************************** 核心接口声明 **************************/
/**
* @brief 菜单组件初始化(必须首先调用)
* @return 错误码
*/
MenuErrCode menu_init(void);
/**
* @brief 菜单主循环(需在用户主循环中调用,处理事件和刷新显示)
*/
void menu_main_loop(void);
/**
* @brief 发送事件到菜单事件队列(如按键事件、自定义事件)
* @param type 事件类型
* @param param 事件附加参数(可选,如按键长按时间)
* @return 错误码
*/
MenuErrCode menu_post_event(MenuEventType type, uint32_t param);
/**
* @brief 注册菜单节点(构建菜单树)
* @param parent_id 父节点ID根节点填0
* @param node_id 当前节点ID唯一不可重复
* @param name_str 菜单名称字符串(或多语言索引)
* @param enter_cb 进入该菜单的回调函数NULL表示无
* @param exit_cb 退出该菜单的回调函数NULL表示无
* @return 错误码
*/
MenuErrCode menu_register_node(MenuNodeId parent_id, MenuNodeId node_id, const char* name_str, MenuCallback enter_cb, MenuCallback exit_cb);
/**
* @brief 获取当前选中的菜单节点ID
* @param node_id 输出参数当前节点ID
* @return 错误码
*/
MenuErrCode menu_get_current_node(MenuNodeId* node_id);
/************************** 功能扩展接口声明(可裁剪) **************************/
#if MENU_CONFIG_ENABLE_PARAM
/**
* @brief 参数类型枚举
*/
typedef enum {
MENU_PARAM_TYPE_INT8,
MENU_PARAM_TYPE_UINT8,
MENU_PARAM_TYPE_INT16,
MENU_PARAM_TYPE_UINT16,
MENU_PARAM_TYPE_INT32,
MENU_PARAM_TYPE_UINT32,
MENU_PARAM_TYPE_FLOAT,
} MenuParamType;
/**
* @brief 注册参数到菜单节点(参数管理功能)
* @param node_id 菜单节点ID参数与菜单绑定
* @param param_id 参数ID唯一
* @param type 参数类型
* @param min_val 最小值(浮点型,内部自动转换)
* @param max_val 最大值(浮点型,内部自动转换)
* @param default_val 默认值(浮点型,内部自动转换)
* @param scale 缩放因子如0.1表示保留1位小数
* @return 错误码
*/
MenuErrCode menu_param_register(MenuNodeId node_id, uint16_t param_id, MenuParamType type, float min_val, float max_val, float default_val, float scale);
/**
* @brief 设置参数值
* @param param_id 参数ID
* @param value 新值(浮点型,内部自动转换)
* @return 错误码
*/
MenuErrCode menu_param_set_value(uint16_t param_id, float value);
/**
* @brief 获取参数值
* @param param_id 参数ID
* @param value 输出参数,当前值(浮点型)
* @return 错误码
*/
MenuErrCode menu_param_get_value(uint16_t param_id, float* value);
#endif // MENU_CONFIG_ENABLE_PARAM
#if MENU_CONFIG_ENABLE_LANG
/**
* @brief 设置当前语言
* @param lang_id 语言ID如0-中文1-英文)
* @return 错误码
*/
MenuErrCode menu_lang_set_current(uint8_t lang_id);
/**
* @brief 获取当前语言
* @param lang_id 输出参数当前语言ID
* @return 错误码
*/
MenuErrCode menu_lang_get_current(uint8_t* lang_id);
#endif // MENU_CONFIG_ENABLE_LANG
#endif // MENU_H