1. 修复UI管理模块的问题
This commit is contained in:
parent
28aa36f70f
commit
164b291f11
@ -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
|
||||||
|
|||||||
@ -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)) {
|
||||||
|
if (pageManage.currPage != pageManage.homePage) {
|
||||||
|
LogD("currPage[%d], backHome", pageManage.currPage);
|
||||||
SwitchPage(pageManage.homePage);
|
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));
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user