#ifndef LANGUAGE_H #define LANGUAGE_H /* Includes ----------------------------------------------------------------------------------------------------------*/ #include "../../src/lang/menu_lang.h" #include "../../src/core/menu_core.h" /* 类型定义 ---------------------------------------------------------------------------------------------------------*/ /** * @brief 系统语言枚举 * @note 与核心菜单库语言ID映射,便于扩展 */ typedef enum { SYSTEM_LANG_CHINESE = 0, // 中文(默认) SYSTEM_LANG_ENGLISH, // 英文 SYSTEM_LANG_JAPANESE, // 日语 SYSTEM_LANG_GERMAN, // 德语 SYSTEM_LANG_MAX, // 语言类型总数(仅用于遍历/边界判断) } SystemLang_e; /** * @brief 文本ID枚举(按模块分级) * @note 采用模块化命名,便于扩展和维护 * 分级规则: * - 基础文本(0x0000~0x00FF) * - 主菜单(0x0100~0x01FF) * - 测量菜单(0x0200~0x02FF) * - 保护菜单(0x0300~0x03FF) * - 控制菜单(0x0400~0x04FF) * - 设置菜单(0x0500~0x05FF) * - 记录菜单(0x0600~0x06FF) * - 帮助菜单(0x0700~0x07FF) * - 关于菜单(0x0800~0x08FF) * - 持久化相关(0x0900~0x09FF) */ typedef enum { // 基础文本(0x0000 ~ 0x00FF) TEXT_ENTER = 0x0000, // 进入 TEXT_EXIT, // 退出 TEXT_RETURN, // 返回 TEXT_OK, // 确定 TEXT_CANCEL, // 取消 TEXT_SAVE, // 保存 TEXT_LOAD, // 加载 // 主菜单文本(0x0100 ~ 0x01FF) TEXT_MAIN_MENU = 0x0100, // 主菜单 TEXT_MAIN_MEASUREMENT, // 测量 TEXT_MAIN_PROTECTION, // 保护 TEXT_MAIN_CONTROL, // 控制 TEXT_MAIN_SETTING, // 设置 TEXT_MAIN_RECORD, // 记录 TEXT_MAIN_HELP, // 帮助 TEXT_MAIN_ABOUT, // 关于 // 测量菜单文本(0x0200 ~ 0x02FF) TEXT_MEASURE_VOLTAGE = 0x0200, // 电压 TEXT_MEASURE_CURRENT, // 电流 TEXT_MEASURE_POWER, // 功率 TEXT_MEASURE_ENERGY, // 能量 TEXT_MEASURE_FREQUENCY, // 频率 TEXT_MEASURE_TEMPERATURE, // 温度 // 保护菜单文本(0x0300 ~ 0x03FF) TEXT_PROTECT_OVER_VOLTAGE = 0x0300, // 过电压保护 TEXT_PROTECT_UNDER_VOLTAGE, // 欠电压保护 TEXT_PROTECT_OVER_CURRENT, // 过电流保护 TEXT_PROTECT_SETTING, // 保护设置 // 控制菜单文本(0x0400 ~ 0x04FF) TEXT_CONTROL_ON_OFF = 0x0400, // 开关控制 TEXT_CONTROL_START_STOP, // 启停控制 TEXT_CONTROL_AUTO_MANUAL, // 自动/手动切换 // 设置菜单文本(0x0500 ~ 0x05FF) TEXT_SETTING_LANGUAGE = 0x0500, // 语言设置 // 记录菜单文本(0x0600 ~ 0x06FF) TEXT_RECORD_EVENT = 0x0600, // 事件记录 // 帮助菜单文本(0x0700 ~ 0x07FF) TEXT_HELP_GUIDE = 0x0700, // 指南 // 关于菜单文本(0x0800 ~ 0x08FF) TEXT_ABOUT_VERSION = 0x0800, // 版本信息 // 持久化相关文本(0x0900 ~ 0x09FF) TEXT_PERSIST_SAVE_STATE = 0x0900, // 保存菜单状态 TEXT_PERSIST_RESTORE_STATE, // 恢复菜单状态 TEXT_PERSIST_SAVE_SUCCESS, // 保存成功 TEXT_PERSIST_SAVE_FAILED, // 保存失败 TEXT_PERSIST_RESTORE_SUCCESS, // 恢复成功 TEXT_PERSIST_RESTORE_FAILED, // 恢复失败 // 提示信息(0x0A00 ~ 0x0AFF) TEXT_ERROR = 0x0A00, // 错误 TEXT_WARNING, // 警告 TEXT_SUCCESS, // 成功 TEXT_INFO, // 信息 TEXT_TEST, // 测试 TEXT_SELECT_OPTION, // 选择操作 TEXT_CURRENT, // 当前 TEXT_STATUS, // 状态 TEXT_SUMMARY, // 摘要 TEXT_EMPTY, // 空 TEXT_CURRENT_SELECTION, // 当前选择 TEXT_OPERATIONS, // 操作 TEXT_SELECT_ITEM, // 选择项 TEXT_ENTER_SUBMENU, // 进入子菜单 TEXT_RETURN_PARENT, // 返回父菜单 TEXT_SELECT_PREVIOUS, // 选择上一项 TEXT_SELECT_NEXT, // 选择下一项 TEXT_START_DEFAULT, // 从默认开始 TEXT_REGISTER_CALLBACK_FAILED, // 注册回调失败 TEXT_RESTORE_MENU_STATE, // 恢复菜单状态 TEXT_RESTORE_MENU_STATE_FAILED, // 恢复菜单状态失败 TEXT_SAVE_MENU_STATE_FAILED, // 保存菜单状态失败 TEXT_SAVE_MENU_STATE, // 保存菜单状态 // 操作提示(0x0B00 ~ 0x0BFF) TEXT_UP_ARROW = 0x0B00, // 上箭头 TEXT_DOWN_ARROW, // 下箭头 TEXT_LEFT_ARROW, // 左箭头 TEXT_RIGHT_ARROW, // 右箭头 TEXT_MAX = 0x0FFF, // 所有文本ID最大值(用于边界检查) } TextId_e; /** * @brief 菜单节点ID枚举 * @note 采用模块化命名,便于扩展和维护 * 分级规则: * - 一级菜单(0x1000~0x1FFF) * - 二级菜单(0x2000~0x2FFF) * - 三级菜单(0x3000~0x3FFF) * - 四级菜单(0x4000~0x4FFF) */ typedef enum { // 无效节点/根节点标记 MENU_NODE_ID_NONE = 0x0000, // 一级菜单(0x1000 ~ 0x1FFF) MENU_NODE_ID_MAIN = 0x1000, // 主菜单 MENU_NODE_ID_MEASUREMENT, // 测量菜单 MENU_NODE_ID_PROTECTION, // 保护菜单 MENU_NODE_ID_CONTROL, // 控制菜单 MENU_NODE_ID_SETTING, // 设置菜单 MENU_NODE_ID_RECORD, // 记录菜单 MENU_NODE_ID_HELP, // 帮助菜单 MENU_NODE_ID_ABOUT, // 关于菜单 // 二级菜单:测量菜单子项(0x2000 ~ 0x20FF) MENU_NODE_ID_MEASUREMENT_VOLTAGE = 0x2000, // 电压测量 MENU_NODE_ID_MEASUREMENT_CURRENT, // 电流测量 MENU_NODE_ID_MEASUREMENT_POWER, // 功率测量 MENU_NODE_ID_MEASUREMENT_ENERGY, // 能量测量 MENU_NODE_ID_MEASUREMENT_FREQUENCY, // 频率测量 MENU_NODE_ID_MEASUREMENT_TEMPERATURE, // 温度测量 // 二级菜单:保护菜单子项(0x2100 ~ 0x21FF) MENU_NODE_ID_PROTECTION_OVER_VOLTAGE = 0x2100, // 过电压保护 MENU_NODE_ID_PROTECTION_UNDER_VOLTAGE, // 欠电压保护 MENU_NODE_ID_PROTECTION_OVER_CURRENT, // 过电流保护 MENU_NODE_ID_PROTECTION_SETTING, // 保护设置 // 二级菜单:控制菜单子项(0x2200 ~ 0x22FF) MENU_NODE_ID_CONTROL_ON_OFF = 0x2200, // 开关控制 MENU_NODE_ID_CONTROL_START_STOP, // 启停控制 MENU_NODE_ID_CONTROL_AUTO_MANUAL, // 自动/手动切换 // 二级菜单:设置菜单子项(0x2300 ~ 0x23FF) MENU_NODE_ID_SETTING_LANGUAGE = 0x2300, // 语言设置 // 二级菜单:记录菜单子项(0x2400 ~ 0x24FF) MENU_NODE_ID_RECORD_EVENT = 0x2400, // 事件记录 // 二级菜单:帮助菜单子项(0x2500 ~ 0x25FF) MENU_NODE_ID_HELP_GUIDE = 0x2500, // 指南 // 二级菜单:关于菜单子项(0x2600 ~ 0x26FF) MENU_NODE_ID_ABOUT_VERSION = 0x2600, // 版本信息 MENU_NODE_ID_MAX = 0x4FFF, // 菜单节点ID最大值 } MenuNodeId_e; /** * @brief 菜单节点属性枚举 * @note 使用位掩码方式,便于组合和扩展 */ typedef enum { MENU_NODE_ATTR_NONE = 0x00, // 无属性 MENU_NODE_ATTR_HAS_CHILDREN = 0x01, // 有子节点 MENU_NODE_ATTR_OPERABLE = 0x02, // 可操作 MENU_NODE_ATTR_VISIBLE = 0x04, // 可见 MENU_NODE_ATTR_EDITABLE = 0x08, // 可编辑 } MenuNodeAttr_e; /** * @brief 菜单节点信息结构体 * @note 用于建立菜单节点ID与文本ID、父子关系、属性等映射 * 采用更紧凑的设计,便于扩展 */ typedef struct { MenuNodeId_e node_id; // 当前菜单节点ID(唯一标识) MenuNodeId_e parent_id; // 父节点ID(MENU_NODE_ID_NONE表示无父节点) TextId_e text_id; // 对应显示的文本ID uint8_t level; // 菜单层级(1=一级,2=二级,3=三级,4=四级) uint8_t attributes; // 节点属性(使用MenuNodeAttr_e位掩码组合) } MenuNodeInfo_t; /* 宏定义 ---------------------------------------------------------------------------------------------------------*/ /** * @brief 菜单节点属性检查宏 * @param attr 节点属性 * @param flag 要检查的属性标志 * @return 1表示属性存在,0表示属性不存在 */ #define MENU_NODE_HAS_ATTR(attr, flag) ((attr) & (flag)) /** * @brief 菜单框架配置常量 */ #define MENU_CFG_MAX_DEPTH 4 // 最大菜单深度(一级~四级) #define MENU_CFG_MAX_NODES 50 // 最大菜单节点数 #define MENU_CFG_MAX_TEXT_LEN 50 // 最大文本长度(字符数) /* 全局变量声明 ---------------------------------------------------------------------------------------------------*/ /** * @brief 全局菜单节点映射表 * @note 所有菜单节点的关联关系集中在这里维护,修改时仅需调整此表 * 按一级菜单、二级菜单的顺序排列,便于阅读和维护 */ extern const MenuNodeInfo_t menu_node_map[]; /** * @brief 菜单节点映射表大小 */ extern const uint32_t menu_node_map_size; /* 函数声明 ---------------------------------------------------------------------------------------------------------*/ /** * @brief 初始化语言模块 * @return MenuErrCode 操作结果 */ MenuErrCode language_init(void); /** * @brief 根据文本ID获取对应语言的文本字符串 * @param text_id 文本ID * @return const char* 对应语言的文本字符串,若ID无效返回NULL */ const char* get_text(TextId_e text_id); /** * @brief 设置当前系统语言 * @param lang 要设置的语言 * @return MenuErrCode 操作结果 */ MenuErrCode set_language(SystemLang_e lang); /** * @brief 获取当前系统语言 * @return SystemLang_e 当前使用的语言 */ SystemLang_e get_current_language(void); /** * @brief 根据菜单节点ID获取对应的文本ID * @param node_id 菜单节点ID * @return TextId_e 对应的文本ID,若节点不存在返回TEXT_MAX */ TextId_e get_menu_text_id(MenuNodeId_e node_id); /** * @brief 根据菜单节点ID获取对应的父节点ID * @param node_id 菜单节点ID * @return MenuNodeId_e 对应的父节点ID,若节点不存在返回MENU_NODE_ID_NONE */ MenuNodeId_e get_menu_parent_id(MenuNodeId_e node_id); /** * @brief 检查菜单节点是否有子节点 * @param node_id 菜单节点ID * @return uint8_t 1=有子节点,0=无子节点/节点不存在 */ uint8_t menu_node_has_children(MenuNodeId_e node_id); /** * @brief 检查菜单节点是否可操作 * @param node_id 菜单节点ID * @return uint8_t 1=可操作,0=不可操作/节点不存在 */ uint8_t menu_node_is_operable(MenuNodeId_e node_id); /** * @brief 获取菜单节点的显示文本 * @param node_id 菜单节点ID * @return const char* 对应语言的文本字符串,若节点无效返回NULL */ const char* get_menu_node_text(MenuNodeId_e node_id); #endif /* LANGUAGE_H */