ui_main.lua 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168
  1. --[[
  2. @module ui_main
  3. @summary eink用户界面主控模块,负责页面管理和事件分发
  4. @version 1.0
  5. @date 2025.12.25
  6. @author 江访
  7. 本模块为eink用户界面主控模块,主要功能包括:
  8. 1、管理页面切换和事件分发;
  9. 2、处理按键事件并调用对应页面的处理函数;
  10. 3、协调各页面之间的状态转移;
  11. 4、控制界面刷新频率;
  12. 对外接口:
  13. 1、ui_main():用户界面主任务,初始化显示和按键驱动,启动UI主循环
  14. ]]
  15. -- 加载子页面
  16. local home_page = require "home_page"
  17. local eink_page = require "eink_page"
  18. local time_page = require "time_page"
  19. -- 当前页面状态
  20. local current_page = "home"
  21. local last_page = ""
  22. --[[
  23. 切换页面;
  24. 从当前页面切换到目标页面;
  25. @api switch_page(new_page)
  26. @summary 执行页面切换操作
  27. @string new_page 目标页面名称
  28. @valid_values "home", "eink_demo", "time_demo"
  29. @return nil
  30. @usage
  31. -- 切换到主页
  32. switch_page("home")
  33. -- 切换到eink演示页面
  34. switch_page("eink_demo")
  35. -- 切换到时间显示页面
  36. switch_page("time_demo")
  37. ]]
  38. local function switch_page(new_page)
  39. log.info("switch_page", "从", current_page, "切换到", new_page)
  40. -- 调用旧页面的退出函数
  41. if current_page == "home" and home_page.on_leave then
  42. home_page.on_leave()
  43. elseif current_page == "eink_demo" and eink_page.on_leave then
  44. eink_page.on_leave()
  45. elseif current_page == "time_demo" and time_page.on_leave then
  46. time_page.on_leave()
  47. end
  48. last_page = current_page
  49. current_page = new_page
  50. -- 调用新页面的进入函数
  51. if new_page == "home" and home_page.on_enter then
  52. home_page.on_enter()
  53. elseif new_page == "eink_demo" and eink_page.on_enter then
  54. eink_page.on_enter()
  55. elseif new_page == "time_demo" and time_page.on_enter then
  56. time_page.on_enter()
  57. end
  58. log.info("ui_main", "已切换到页面:", current_page)
  59. end
  60. --[[
  61. 处理按键事件;
  62. 根据按键类型和当前页面调用对应的处理函数;
  63. @api handle_key_event(key_event)
  64. @summary 处理按键事件并分发到对应页面
  65. @string key_event 按键事件类型
  66. @valid_values "switch_up", "confirm_up", "switch_down", "confirm_down"
  67. @return bool 事件处理成功返回true,否则返回false
  68. @usage
  69. -- 在ui_main任务中调用
  70. local handled = handle_key_event("switch_up")
  71. ]]
  72. local function handle_key_event(key_event)
  73. log.info("按键事件", "event:", key_event, "当前页面:", current_page)
  74. if key_event == "switch_up" then
  75. -- 切换键释放:在主页切换选项,在时间页面切换格式
  76. if current_page == "home" then
  77. -- 主页:切换选项
  78. return home_page.handle_key("switch_up", switch_page)
  79. elseif current_page == "time_demo" then
  80. -- 时间页面:切换时间格式
  81. if time_page.handle_key then
  82. return time_page.handle_key("switch_up", switch_page)
  83. end
  84. end
  85. -- 其他页面切换键无功能
  86. return false
  87. elseif key_event == "confirm_up" then
  88. -- 确认键释放:确认/返回功能
  89. if current_page == "home" then
  90. return home_page.handle_key("confirm_up", switch_page)
  91. elseif current_page == "eink_demo" then
  92. -- eink演示页面:返回首页
  93. if eink_page.handle_key then
  94. return eink_page.handle_key("confirm_up", switch_page)
  95. end
  96. elseif current_page == "time_demo" then
  97. -- 时间页面:返回首页
  98. if time_page.handle_key then
  99. return time_page.handle_key("confirm_up", switch_page)
  100. end
  101. end
  102. end
  103. -- 可以忽略按下事件,只处理释放事件
  104. return false
  105. end
  106. --[[
  107. 用户界面主任务;
  108. 初始化显示和按键驱动,启动UI主循环;
  109. @api ui_main()
  110. @summary 初始化显示和按键驱动,启动UI主循环
  111. @return nil
  112. @usage
  113. -- 在主程序中通过sys.taskInit调用
  114. sys.taskInit(ui_main)
  115. ]]
  116. local function ui_main()
  117. -- 调用主页的进入函数
  118. if home_page.on_enter then
  119. home_page.on_enter()
  120. end
  121. while true do
  122. -- 根据当前页面绘制内容
  123. if current_page == "home" then
  124. home_page.draw()
  125. elseif current_page == "eink_demo" then
  126. eink_page.draw()
  127. elseif current_page == "time_demo" then
  128. time_page.draw()
  129. end
  130. local result, key_event = sys.waitUntil("KEY_EVENT")
  131. if result then
  132. -- 处理按键事件
  133. handle_key_event(key_event)
  134. else
  135. -- 超时:时间页面需要刷新显示
  136. if current_page == "time_demo" then
  137. if time_page.need_update and time_page.need_update() then
  138. time_page.draw()
  139. end
  140. end
  141. end
  142. end
  143. end
  144. sys.taskInit(ui_main)