整定一版
This commit is contained in:
215
src/core/menu_stack.c
Normal file
215
src/core/menu_stack.c
Normal file
@ -0,0 +1,215 @@
|
||||
/**
|
||||
**********************************************************************************************************************
|
||||
* @file menu_stack.c
|
||||
* @brief 菜单组件栈管理实现
|
||||
* @author menu_component
|
||||
* @date 2025-12-19
|
||||
**********************************************************************************************************************
|
||||
*/
|
||||
|
||||
/* Includes ----------------------------------------------------------------------------------------------------------*/
|
||||
#include "menu_types.h"
|
||||
|
||||
/* 函数实现 ---------------------------------------------------------------------------------------------------------*/
|
||||
|
||||
/**
|
||||
* @brief 初始化菜单栈
|
||||
* @param stack 栈指针
|
||||
* @param max_depth 最大深度
|
||||
*/
|
||||
void menu_stack_init(MenuStack* stack, uint8_t max_depth)
|
||||
{
|
||||
MENU_ASSERT(stack != NULL);
|
||||
|
||||
stack->top = 0;
|
||||
stack->max_depth = max_depth;
|
||||
|
||||
// 初始化栈元素为0
|
||||
for (uint8_t i = 0; i < max_depth; i++) {
|
||||
stack->items[i] = 0;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 检查栈是否为空
|
||||
* @param stack 栈指针
|
||||
* @return true为空,false不为空
|
||||
*/
|
||||
bool menu_stack_is_empty(const MenuStack* stack)
|
||||
{
|
||||
MENU_ASSERT(stack != NULL);
|
||||
return (stack->top == 0);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 检查栈是否已满
|
||||
* @param stack 栈指针
|
||||
* @return true已满,false未满
|
||||
*/
|
||||
bool menu_stack_is_full(const MenuStack* stack)
|
||||
{
|
||||
MENU_ASSERT(stack != NULL);
|
||||
return (stack->top >= stack->max_depth);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 获取栈的当前深度
|
||||
* @param stack 栈指针
|
||||
* @return 当前深度
|
||||
*/
|
||||
uint8_t menu_stack_get_depth(const MenuStack* stack)
|
||||
{
|
||||
MENU_ASSERT(stack != NULL);
|
||||
return stack->top;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 向栈中压入元素
|
||||
* @param stack 栈指针
|
||||
* @param node_id 要压入的节点ID
|
||||
* @return 错误码
|
||||
*/
|
||||
MenuErrCode menu_stack_push(MenuStack* stack, MenuNodeId node_id)
|
||||
{
|
||||
MENU_ASSERT(stack != NULL);
|
||||
|
||||
if (menu_stack_is_full(stack)) {
|
||||
return MENU_ERR_OUT_OF_MEMORY;
|
||||
}
|
||||
|
||||
stack->items[stack->top] = node_id;
|
||||
stack->top++;
|
||||
|
||||
return MENU_ERR_OK;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 从栈中弹出元素
|
||||
* @param stack 栈指针
|
||||
* @param node_id 用于存储弹出的节点ID
|
||||
* @return 错误码
|
||||
*/
|
||||
MenuErrCode menu_stack_pop(MenuStack* stack, MenuNodeId* node_id)
|
||||
{
|
||||
MENU_ASSERT(stack != NULL);
|
||||
MENU_ASSERT(node_id != NULL);
|
||||
|
||||
if (menu_stack_is_empty(stack)) {
|
||||
return MENU_ERR_QUEUE_EMPTY;
|
||||
}
|
||||
|
||||
stack->top--;
|
||||
*node_id = stack->items[stack->top];
|
||||
stack->items[stack->top] = 0;
|
||||
|
||||
return MENU_ERR_OK;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 获取栈顶元素
|
||||
* @param stack 栈指针
|
||||
* @param node_id 用于存储栈顶节点ID
|
||||
* @return 错误码
|
||||
*/
|
||||
MenuErrCode menu_stack_peek(const MenuStack* stack, MenuNodeId* node_id)
|
||||
{
|
||||
MENU_ASSERT(stack != NULL);
|
||||
MENU_ASSERT(node_id != NULL);
|
||||
|
||||
if (menu_stack_is_empty(stack)) {
|
||||
return MENU_ERR_QUEUE_EMPTY;
|
||||
}
|
||||
|
||||
*node_id = stack->items[stack->top - 1];
|
||||
|
||||
return MENU_ERR_OK;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 清空栈
|
||||
* @param stack 栈指针
|
||||
*/
|
||||
void menu_stack_clear(MenuStack* stack)
|
||||
{
|
||||
MENU_ASSERT(stack != NULL);
|
||||
|
||||
stack->top = 0;
|
||||
|
||||
// 清空栈元素
|
||||
for (uint8_t i = 0; i < stack->max_depth; i++) {
|
||||
stack->items[i] = 0;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 初始化菜单导航路径
|
||||
* @param nav_path 导航路径指针
|
||||
* @param max_depth 最大深度
|
||||
*/
|
||||
void menu_nav_path_init(MenuNavPath* nav_path, uint8_t max_depth)
|
||||
{
|
||||
MENU_ASSERT(nav_path != NULL);
|
||||
|
||||
nav_path->depth = 0;
|
||||
nav_path->max_depth = max_depth;
|
||||
|
||||
// 初始化路径为0
|
||||
for (uint8_t i = 0; i < max_depth; i++) {
|
||||
nav_path->path[i] = 0;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 添加导航路径节点
|
||||
* @param nav_path 导航路径指针
|
||||
* @param node_id 要添加的节点ID
|
||||
* @return 错误码
|
||||
*/
|
||||
MenuErrCode menu_nav_path_add(MenuNavPath* nav_path, MenuNodeId node_id)
|
||||
{
|
||||
MENU_ASSERT(nav_path != NULL);
|
||||
|
||||
if (nav_path->depth >= nav_path->max_depth) {
|
||||
return MENU_ERR_OUT_OF_MEMORY;
|
||||
}
|
||||
|
||||
nav_path->path[nav_path->depth] = node_id;
|
||||
nav_path->depth++;
|
||||
|
||||
return MENU_ERR_OK;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 移除导航路径最后一个节点
|
||||
* @param nav_path 导航路径指针
|
||||
* @return 错误码
|
||||
*/
|
||||
MenuErrCode menu_nav_path_remove_last(MenuNavPath* nav_path)
|
||||
{
|
||||
MENU_ASSERT(nav_path != NULL);
|
||||
|
||||
if (nav_path->depth == 0) {
|
||||
return MENU_ERR_QUEUE_EMPTY;
|
||||
}
|
||||
|
||||
nav_path->depth--;
|
||||
nav_path->path[nav_path->depth] = 0;
|
||||
|
||||
return MENU_ERR_OK;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 清空导航路径
|
||||
* @param nav_path 导航路径指针
|
||||
*/
|
||||
void menu_nav_path_clear(MenuNavPath* nav_path)
|
||||
{
|
||||
MENU_ASSERT(nav_path != NULL);
|
||||
|
||||
nav_path->depth = 0;
|
||||
|
||||
// 清空路径
|
||||
for (uint8_t i = 0; i < nav_path->max_depth; i++) {
|
||||
nav_path->path[i] = 0;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user