2025-11-26 19:16:32 +08:00
|
|
|
|
#include "./lv_lib_pm.h"
|
2025-08-05 16:06:46 +08:00
|
|
|
|
#include <string.h>
|
|
|
|
|
|
|
|
|
|
|
|
// 定义全局实例
|
|
|
|
|
|
PageManager_t PageManager;
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* 初始化页面管理器
|
|
|
|
|
|
*/
|
2025-11-26 19:22:06 +08:00
|
|
|
|
void lv_lib_pm_Init(void) {
|
2025-08-05 16:06:46 +08:00
|
|
|
|
memset(&PageManager, 0, sizeof(PageManager));
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2025-09-22 21:45:02 +08:00
|
|
|
|
/**
|
|
|
|
|
|
* load init screen
|
|
|
|
|
|
*/
|
2025-11-26 19:22:06 +08:00
|
|
|
|
void lv_lib_pm_load_init_screen(void) {
|
2025-09-22 21:45:02 +08:00
|
|
|
|
if (PageManager.count == 0) return;
|
|
|
|
|
|
|
|
|
|
|
|
Page_t* initial_page = PageManager.pages[0];
|
|
|
|
|
|
if (initial_page->init) initial_page->init();
|
2025-11-26 19:16:32 +08:00
|
|
|
|
lv_scr_load_anim(*initial_page->page_obj, LV_SCR_LOAD_ANIM_MOVE_LEFT, 200, 0, true);
|
2025-09-22 21:45:02 +08:00
|
|
|
|
PageManager.current_index = 0;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2025-08-05 16:06:46 +08:00
|
|
|
|
/**
|
|
|
|
|
|
* 注册一个新页面
|
|
|
|
|
|
* @param page 页面结构体指针
|
|
|
|
|
|
*/
|
2025-11-26 19:22:06 +08:00
|
|
|
|
void lv_lib_pm_register(Page_t* page) {
|
2025-08-05 16:06:46 +08:00
|
|
|
|
if (PageManager.count >= MAX_PAGES) {
|
|
|
|
|
|
LV_LOG_WARN("PageManager: page list is full!");
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
PageManager.pages[PageManager.count++] = page;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* 切换到下一个页面(循环)
|
|
|
|
|
|
*/
|
2025-11-26 19:22:06 +08:00
|
|
|
|
void lv_lib_pm_next(void) {
|
2025-08-05 16:06:46 +08:00
|
|
|
|
if (PageManager.count == 0) return;
|
|
|
|
|
|
|
2025-10-07 10:28:48 +08:00
|
|
|
|
Page_t* prev = PageManager.pages[PageManager.current_index];
|
2025-08-05 16:06:46 +08:00
|
|
|
|
Page_t* next = PageManager.pages[(PageManager.current_index + 1) % PageManager.count];
|
|
|
|
|
|
|
2025-10-07 10:28:48 +08:00
|
|
|
|
// 初始化新页面并切换
|
|
|
|
|
|
if (next->init) next->init();
|
|
|
|
|
|
lv_scr_load_anim(*next->page_obj, LV_SCR_LOAD_ANIM_MOVE_LEFT, 200, 0, true);
|
|
|
|
|
|
|
|
|
|
|
|
// 反初始化前页
|
|
|
|
|
|
if (prev->deinit) prev->deinit();
|
2025-08-05 16:06:46 +08:00
|
|
|
|
|
|
|
|
|
|
// 更新索引
|
|
|
|
|
|
PageManager.current_index = (PageManager.current_index + 1) % PageManager.count;
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* 切换到上一个页面(循环)
|
|
|
|
|
|
*/
|
2025-11-26 19:22:06 +08:00
|
|
|
|
void lv_lib_pm_prev(void) {
|
2025-08-05 16:06:46 +08:00
|
|
|
|
if (PageManager.count == 0) return;
|
|
|
|
|
|
|
|
|
|
|
|
Page_t* current = PageManager.pages[PageManager.current_index];
|
|
|
|
|
|
uint8_t prev_index = (PageManager.current_index == 0) ?
|
|
|
|
|
|
PageManager.count - 1 : PageManager.current_index - 1;
|
|
|
|
|
|
Page_t* prev = PageManager.pages[prev_index];
|
|
|
|
|
|
|
2025-10-07 10:28:48 +08:00
|
|
|
|
if (prev->init) prev->init();
|
|
|
|
|
|
lv_scr_load_anim(*prev->page_obj, LV_SCR_LOAD_ANIM_MOVE_RIGHT, 200, 0, true);
|
|
|
|
|
|
|
2025-08-05 16:06:46 +08:00
|
|
|
|
if (current->deinit) current->deinit();
|
|
|
|
|
|
|
|
|
|
|
|
PageManager.current_index = prev_index;
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* 跳转到指定索引页面
|
|
|
|
|
|
* @param index 目标页面索引
|
|
|
|
|
|
*/
|
2025-11-26 19:22:06 +08:00
|
|
|
|
void lv_lib_pm_goto(uint8_t index) {
|
2025-08-05 16:06:46 +08:00
|
|
|
|
if (index >= PageManager.count || PageManager.count == 0) return;
|
|
|
|
|
|
|
|
|
|
|
|
Page_t* current = PageManager.pages[PageManager.current_index];
|
|
|
|
|
|
Page_t* target = PageManager.pages[index];
|
|
|
|
|
|
|
|
|
|
|
|
if (current != target) {
|
|
|
|
|
|
if (current->deinit) current->deinit();
|
|
|
|
|
|
PageManager.current_index = index;
|
|
|
|
|
|
if (target->init) target->init();
|
|
|
|
|
|
lv_scr_load_anim(*target->page_obj, LV_SCR_LOAD_ANIM_FADE_IN, 200, 0, true);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* 获取当前页面
|
|
|
|
|
|
* @return 当前页面指针
|
|
|
|
|
|
*/
|
2025-11-26 19:22:06 +08:00
|
|
|
|
Page_t* lv_lib_pm_get_current_page(void) {
|
2025-08-05 16:06:46 +08:00
|
|
|
|
if (PageManager.count == 0) return NULL;
|
|
|
|
|
|
return PageManager.pages[PageManager.current_index];
|
|
|
|
|
|
}
|
2025-10-15 10:25:22 +08:00
|
|
|
|
|
2025-09-27 10:51:54 +08:00
|
|
|
|
/**
|
|
|
|
|
|
* 处理按键事件,调用当前页面的按键事件处理函数
|
|
|
|
|
|
* @param key_id 按键ID
|
|
|
|
|
|
*/
|
2025-12-02 19:23:43 +08:00
|
|
|
|
void lv_lib_pm_handle_key_event(void* key_event) {
|
2025-11-26 19:22:06 +08:00
|
|
|
|
Page_t* current_page = lv_lib_pm_get_current_page();
|
2025-09-27 10:51:54 +08:00
|
|
|
|
if (current_page && current_page->key_event_handler) {
|
2025-12-02 19:23:43 +08:00
|
|
|
|
current_page->key_event_handler(key_event); // 调用当前页面的按键事件处理函数
|
2025-09-27 10:51:54 +08:00
|
|
|
|
} else {
|
2025-10-07 10:28:48 +08:00
|
|
|
|
LV_LOG_WARN("No key event handler for current page\n");
|
2025-09-27 10:51:54 +08:00
|
|
|
|
}
|
|
|
|
|
|
}
|