Files
menu/demo/language.h
2025-12-19 17:01:27 +08:00

311 lines
12 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.

#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; // 父节点IDMENU_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 */