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

View File

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