motor_cs103/User/lib/menu/menu.h

275 lines
7.8 KiB
C
Raw Permalink 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 __MENU_H__
#define __MENU_H__
#include "lib.h"
/******************************************* 配置项 ********************************************************************/
/* 定义 _MENU_USE_MALLOC_ 则采用 MALLOC/FREE 的方式实现多级菜单, 否则通过数组的形式 */
// #define _MENU_USE_MALLOC_
/* 定义 _MENU_USE_SHORTCUT_ 则启用快捷菜单选项进入功能 */
#define _MENU_USE_SHORTCUT_
/* 多级菜单深度 */
#define MENU_MAX_DEPTH 5
/* 菜单支持的最大选项数目 */
#define MENU_MAX_NUM 40
/* 菜单支持的语种数目 */
#define MENU_SUPPORT_LANGUAGE 2
/******************************************* 配置项 ********************************************************************/
/* exported types ----------------------------------------------------------------------------------------------------*/
typedef uint16_t menusize_t;
typedef void (*menu_call_fun_f)(void);
typedef struct
{
menusize_t items_num; /*!< 当前菜单中选项的总数目 */
menusize_t select_item; /*!< 当前菜单中被选中的选项 */
menusize_t show_base_item; /*!< 当前菜单首个显示的选项 */
uint8_t page_no; /*!< 当前菜单的页码 */
char *psz_desc; /*!< 当前菜单的字符串描述 */
char *psz_items_desc[MENU_MAX_NUM]; /*!< 当前菜单中所有选项的字符串描述 */
void *p_items_ex_data[MENU_MAX_NUM]; /*!< 当前菜单中所有选项注册时的扩展数据 */
} menu_show_t;
typedef void (*showmenu_call_fun_f)(menu_show_t *pt_show_info);
typedef struct
{
const char *(psz_desc[MENU_SUPPORT_LANGUAGE]);
} menu_txt_t;
/**
* @brief 菜单信息注册结构体
*
*/
typedef struct
{
uint16_t window_no; /*!< 当前菜单的窗口号 */
BOOL single_page; /*!< 当前菜单是否为单页TRUE页面 FALSE有二级菜单 */
const char *(psz_desc[MENU_SUPPORT_LANGUAGE]); /*!< 当前选项的字符串描述(多语种) */
menu_call_fun_f pfn_enter_call_fun; /*!< 当前菜单选项进入时(从父菜单进入)需要执行一次的函数, 为null不执行 */
menu_call_fun_f pfn_exit_call_fun; /*!< 当前菜单选项进入后退出时(退出至父菜单)需要执行一次的函数, 为null不执行 */
menu_call_fun_f pfn_load_call_fun; /*!< 当前菜单选项每次加载时(从父菜单进入或子菜单退出)需要执行一次的函数, 为null不执行 */
menu_call_fun_f pfn_run_call_fun; /*!< 当前菜单选项的周期调度函数 */
void *p_extend_data; /*!< 当前选项的菜单显示效果函数扩展数据入参, 可自行设置该内容 赋值给p_items_ex_data*/
} menu_list_t, menu_item_t;
/**
* @brief 菜单信息注册结构体
*
*/
typedef struct
{
const char *(psz_desc[MENU_SUPPORT_LANGUAGE]); /*!< 当前选项的字符串描述(多语种) */
menu_call_fun_f pfn_enter_call_fun; /*!< 主前菜单进入时(进入菜单)需要执行一次的函数, 为null不执行 */
menu_call_fun_f pfn_exit_call_fun; /*!< 主前菜单进入后退出时(退出菜单)需要执行一次的函数, 为null不执行 */
menu_call_fun_f pfn_load_call_fun; /*!< 主菜单每次加载时需要执行一次的函数, 为null不执行 */
menu_call_fun_f pfn_run_call_fun; /*!< 主菜单周期调度函数 */
} main_menu_cfg_t;
/* exported constants ------------------------------------------------------------------------------------------------*/
/* exported macro ----------------------------------------------------------------------------------------------------*/
#define COT_GET_MENU_NUM(x) (sizeof(x) / sizeof(menu_list_t))
/* exported functions ------------------------------------------------------------------------------------------------*/
/* 菜单初始化和反初始化 */
extern BOOL menu_init(const main_menu_cfg_t *p_main_menu);
extern BOOL menu_de_init(void);
extern BOOL menu_unbind(void);
extern BOOL menu_bind(uint16_t parent_window_no, const menu_list_t *p_menu_list, menusize_t menu_num, showmenu_call_fun_f pfn_show_menu_fun);
/* 菜单功能设置 */
extern BOOL menu_select_language(uint8_t language_idx);
/* 菜单选项显示时需要使用的功能扩展函数 */
extern BOOL menu_limit_show_list_num(menu_show_t *pt_menu_show, menusize_t *p_show_num);
extern BOOL menu_query_parent_menu(menu_show_t *pt_menu_show, uint8_t level);
/* 菜单操作 */
/**
* @brief 进入主菜单
* @return 进入成功返回TRUE否则返回FALSE
*/
extern BOOL menu_main_enter(void);
/**
* @brief 退出主菜单
* @return 退出成功返回TRUE否则返回FALSE
*/
extern BOOL menu_main_exit(void);
/**
* @brief 重置菜单
* @return 重置成功返回TRUE否则返回FALSE
*/
extern BOOL menu_reset(void);
/**
* @brief 进入菜单
* @param p 指向菜单的指针
* @return 进入成功返回TRUE否则返回FALSE
*/
extern BOOL menu_enter(void *p);
/**
* @brief 退出菜单
* @param is_reset 是否重置菜单
* @return 退出成功返回TRUE否则返回FALSE
*/
extern BOOL menu_exit(BOOL is_reset);
/**
* @brief 选择上一个菜单项
* @param is_allow_roll 是否允许循环选择
* @return 选择成功返回TRUE否则返回FALSE
*/
extern BOOL menu_select_previous(BOOL is_allow_roll);
/**
* @brief 选择上一个菜单页
* @param {uint8_t} show_num 每页菜单项数目
* @return {*}
* @note
*/
extern BOOL menu_select_previous_page(uint8_t show_num);
/**
* @brief 选择下一个菜单项
* @param is_allow_roll 是否允许循环选择
* @return 选择成功返回TRUE否则返回FALSE
*/
extern BOOL menu_select_next(BOOL is_allow_roll);
/**
* @brief 选择下一个菜单页
* @param {uint8_t} show_num 每页菜单项数目
* @return {*}
* @note
*/
extern BOOL menu_select_next_page(uint8_t show_num);
/**
* @brief 跳转到指定菜单页
* @param {uint8_t} index 菜单项
* @return {*}
* @note
*/
extern BOOL menu_jump_item(uint8_t index);
/**
* @brief 进入菜单快捷方式
*
* 该函数用于进入菜单的快捷方式。
*
* @param is_absolute 是否为绝对路径
* @param deep 菜单路径的深度
* @param ... 菜单路径的参数列表
* @return BOOL 进入菜单是否成功
*/
extern BOOL menu_shortcut_enter(BOOL is_absolute, uint8_t deep, ...);
/**
* @brief 获取菜单描述的最大长度
*
* 该函数用于获取菜单描述的最大长度。
*
* @param pt_show_info 菜单显示信息的指针
* @return uint8_t 菜单描述的最大长度
*/
extern uint8_t menu_psz_desc_max_size(menu_show_t *pt_show_info);
/**
* @brief 显示菜单文本
*
* 该函数用于显示菜单的文本。
*
* @param buf 存储菜单文本的缓冲区
* @param m_txt 菜单文本的指针
*/
extern void menu_txt_show(char *buf, const menu_txt_t *m_txt);
/**
* @brief 进入指定窗口的菜单
*
* 该函数用于进入指定窗口的菜单。
*
* @param no 窗口编号
* @return BOOL 进入菜单是否成功
*/
extern BOOL menu_enter_with_window_no(uint8_t no);
/**
* @brief 获取当前父窗口的编号
*
* 该函数用于获取当前父窗口的编号。
*
* @return uint16_t 当前父窗口的编号
*/
extern uint16_t menu_current_parent_window_no(void);
/**
* @brief 获取当前窗口的编号
*
* 该函数用于获取当前窗口的编号。
*
* @return uint16_t 当前窗口的编号
*/
extern uint16_t menu_current_window_no(void);
/**
* @brief 获取当前父窗口的信息
*
* 该函数用于获取当前父窗口的信息。
*
* @param info 存储当前窗口信息的指针
* @return BOOL 获取当前窗口信息是否成功
*/
extern BOOL menu_get_parent_window_info(menu_show_t *info);
/**
* @brief 获取当前窗口的信息
*
* 该函数用于获取当前窗口的信息。
*
* @param info 存储当前窗口信息的指针
* @return BOOL 获取当前窗口信息是否成功
*/
extern BOOL menu_get_current_window_info(menu_show_t *info);
/* 菜单轮询处理任务 */
extern BOOL menu_task(void);
#endif // __MENU_H__