整定一版

This commit is contained in:
冯佳
2025-12-19 17:01:27 +08:00
parent 294a49f207
commit 8bddc34c88
43 changed files with 7273 additions and 956 deletions

311
demo/language.h Normal file
View File

@ -0,0 +1,311 @@
#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 */