1. 修复UI管理模块的问题

This commit is contained in:
coffee 2025-04-22 11:57:30 +08:00
parent 28aa36f70f
commit 164b291f11
2 changed files with 110 additions and 26 deletions

View File

@ -18,14 +18,38 @@
#define __COUNT_ARGS(...) __COUNT_ARGS_IMPL(dummy, ##__VA_ARGS__, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0)
#endif
#define USE_UI_PAGE
/** ================================================================= */
// 注册页面函数辅助宏
#define UIPAGE_FUNC(func) uint8_t func##PageCall(uint16_t cmd, void *data, uint16_t len)
#define UIPAGE_DATA data
#define UIPAGE_LEN len
#define UIPAGE_CMD cmd
#if 1
#define UIPAGE_CASE(page, func) case page: { LogD("current page[%d], event[%s]", page, #page); func(); LogD("event End"); } break
#define UIPAGE_CASE_RET(page, func) case page: { LogD("current page[%d], event[%s]", page, #page); return func(); LogD("event End"); } break
#else
#define UIPAGE_CASE(page, func) case page: { func(); } break
#define UIPAGE_CASE_RET(page, func) case page: { return func(); } break
#endif
#define UIPAGE_INIT_FUNC(func) UIPAGE_CASE(kCallInitPage, func)
#define UIPAGE_FREE_FUNC(func) UIPAGE_CASE(kCallFreePage, func)
#define UIPAGE_SHOW_FUNC(func) UIPAGE_CASE(kCallShowPage, func)
#define UIPAGE_HIDE_FUNC(func) UIPAGE_CASE(kCallHidePage, func)
#define UIPAGE_SWITCH_FUNC(func) UIPAGE_CASE_RET(kCallSwitchPage, func)
#define UIPAGE_INDEX_FUNC(func) UIPAGE_CASE(kCallIndexSave, func)
#define UIPAGE_INIT_SHOW_FUNC(init, show) UIPAGE_INIT_FUNC(init); UIPAGE_SHOW_FUNC(show)
#define UIPAGE_DEINIT_HIDE_FUNC(deinit, hide) UIPAGE_FREE_FUNC(deinit); UIPAGE_HIDE_FUNC(hide)
#define UIPAGE_INIT_DEINIT_FUNC(init, deinit) UIPAGE_INIT_FUNC(init); UIPAGE_FREE_FUNC(deinit)
#define UIPAGE_SHOW_HIDE_FUNC(show, hide) UIPAGE_SHOW_FUNC(show); UIPAGE_HIDE_FUNC(hide)
// 对应事件的data转换具体类型宏
#define UI_CALL_INDEX_TYPE(value) ((enum eUIPage *)value)
/** ================================================================= */
// hide -> free -> update Page -> init -> show
@ -42,11 +66,12 @@ enum eCallCmd
};
// 每个页面占用一个枚举, 根据枚举切换页面, kUIPageMax最大页面值, 要求格式统一 kUIPage + 页面名
enum eUIPage
// 每个页面占用一个枚举, 根据枚举切换页面, kUIPageMax最大页面值, 要求格式统一 kUIPage + 页面名, 可以任意调整位置
typedef enum eUIPage
{
kUIPageMax, ///< ui最大个数, 不超过254个页面, 如超过则需要修改字节栈类型
};
} eUIPage;
///< cmd命令, data数据, len数据长度
typedef uint8_t (*pageCallType_t)(uint16_t cmd, void *data, uint16_t len);
@ -62,11 +87,14 @@ void HUIPageSetHome(enum eUIPage page);
// 因为有些页面可能不用HUIPageBack来返回, 所以需要兼容这种情况
void HUIPageSwitch(enum eUIPage page);
// 切换到主页
void HUIPageSwitchHome();
// 返回上一个页面
void HUIPageBack();
// 清空返回栈
void HUIPageClear();
// 清空返回栈, 不允许切换时, 将显示该页面, 而无法继续回栈, 成功返回1, 否则返回0
uint8_t HUIPageClear();
/**
* @brief

View File

@ -61,7 +61,8 @@ static void InitPage() {
static void UpdateIndexEvent(uint8_t currPage, uint8_t isHideEvent, enum eUIPage nextPage) {
pageManage.saveIndex = 1;
// 非回退情况下, 保存索引
pageManage.saveIndex = pageManage.isBack == 0;
if (isHideEvent) {
pageManage.pageCall[currPage](kCallHidePage, NULL, 0);
} else {
@ -98,30 +99,43 @@ static uint8_t CheckSwitchPage() {
return 1;
}
static void SwitchPage(enum eUIPage page) {
static void HideFreePage(enum eUIPage currPage, enum eUIPage nextPage) {
if (pageManage.isInit == 1) {
// hide -> free -> update Page -> init -> show
UpdateIndexEvent(pageManage.currPage, 1, page);
UpdateIndexEvent(currPage, 1, nextPage);
if (pageManage.isBack == 0) {
// 非回退时触发存储索引事件
// hide -> index -> free -> update Page -> init -> show
UpdateIndexEvent(pageManage.currPage, 0, page);
UpdateIndexEvent(currPage, 0, nextPage);
}
if (HBitGet(notFreeBit, pageManage.currPage) == 0) {
if (HBitGet(notFreeBit, currPage) == 0) {
pageManage.pageCall[pageManage.currPage](kCallFreePage, NULL, 0);
HBitSet(initPageBit, pageManage.currPage, 0);
HBitSet(initPageBit, currPage, 0);
}
} else {
pageManage.isInit = 1;
}
}
static void RecoveryUserDataFlag() {
// 上一个页面退出时, 不修改用户数据就重置为0
if (pageManage.modifyUserData == 0) {
pageManage.userData = 0;
}
pageManage.modifyUserData = 0;
}
static void SwitchPage(enum eUIPage page) {
if (CheckPageIsNull(page) == 0) {
LogD("Switch Page[%d] is nullptr", page);
return ;
}
HideFreePage(pageManage.currPage, page);
RecoveryUserDataFlag();
pageManage.prevPage = pageManage.currPage;
pageManage.currPage = page;
@ -137,11 +151,7 @@ static void SwitchPage(enum eUIPage page) {
HBitSet(initPageBit, pageManage.currPage, 1);
pageManage.pageCall[pageManage.currPage](kCallShowPage, NULL, 0);
if (pageManage.modifyUserData == 0) {
pageManage.userData = 0;
}
pageManage.modifyUserData = 0;
RecoveryUserDataFlag();
pageManage.isBack = 0;
}
@ -158,7 +168,7 @@ void HUIPageInit(initPageType_t initPage) {
InitPage();
}
SwitchPage(pageManage.homePage);
//SwitchPage(pageManage.homePage);
}
void HUIPageSetHome(enum eUIPage page) {
@ -191,7 +201,9 @@ void HUIPageSwitch(enum eUIPage page) {
// 切换到首页时清空返回栈
pageManage.isBack = 0;
if (page == pageManage.homePage) {
HUIPageClear();
if (HUIPageClear() == 0) {
return ;
}
} else {
// 如果查找页面在栈中, 说明这个是返回, 当前页面不能入栈
HByteLenType pos = HByteStackFind(pageStack, page);
@ -209,11 +221,27 @@ void HUIPageSwitch(enum eUIPage page) {
SwitchPage(page);
}
void HUIPageSwitchHome() {
if (HUIPageClear() == 0) {
return ;
}
SwitchPage(pageManage.homePage);
}
// 返回上一个页面
void HUIPageBack() {
// 检查当前页面是否允许切换
if (CheckSwitchPage() == 0) {
return ;
}
pageManage.isBack = 1;
if (HByteStackEmpty(pageStack)) {
if (pageManage.currPage != pageManage.homePage) {
LogD("currPage[%d], backHome", pageManage.currPage);
SwitchPage(pageManage.homePage);
}
return;
}
@ -221,10 +249,36 @@ void HUIPageBack() {
HByteStackPop(indexStack);
}
// 清空返回栈
void HUIPageClear() {
HByteStackClear(pageStack);
HByteStackClear(indexStack);
// 清空返回栈, 不允许切换时, 将显示该页面, 而无法继续回栈
uint8_t HUIPageClear() {
uint8_t isBack = pageManage.isBack;
uint8_t needShow = 0;
uint8_t result = 1;
pageManage.isBack = 1;
// 逐个回栈清理
while (HByteStackEmpty(pageStack) == 0) {
if (CheckSwitchPage() == 0) {
if (needShow) {
SwitchPage(pageManage.currPage);
}
result = 0;
break;
}
HideFreePage(pageManage.currPage, HByteStackTop(pageStack));
pageManage.prevPage = pageManage.currPage;
pageManage.currPage = HByteStackTop(pageStack);
RecoveryUserDataFlag();
HByteStackPop(pageStack);
HByteStackPop(indexStack);
needShow = 1;
}
pageManage.isBack = isBack;
return result;
}
/**
@ -258,7 +312,9 @@ void _HUIPageAddStack(int len, ...) {
pageManage.isBack = 1;
} else if (curr == pageManage.homePage) {
// 如果查找不到, 传入的首个页面又是首页, 则清空返回栈
HUIPageClear();
if (HUIPageClear() == 0) {
return ;
}
}
findPos = HByteStackGetUseLen(pageStack);
@ -359,7 +415,7 @@ uint8_t HUIPageSaveIndex(uint8_t value) {
return 1;
}
// 获取当前页面索引
// 获取当前页面索引, 仅在 HUIPageIsBack() 返回1时有效, 否则返回0
uint8_t HUIPageGetIndex() {
if (pageManage.isBack == 0) {
LogD("not back Event, value[%d] size[%d]", HByteStackTop(indexStack), HByteStackGetUseLen(indexStack));