time_page.lua 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189
  1. --[[
  2. @module time_page
  3. @summary 时间显示演示模块
  4. @version 1.0
  5. @date 2025.12.25
  6. @author 江访
  7. @usage
  8. 本模块为时间显示演示功能模块,主要功能包括:
  9. 1、使用os.date接口获取当前时间;
  10. 2、显示多种时间格式;
  11. 3、支持实时时间更新;
  12. 按键功能:
  13. - PWR键:返回主页
  14. - BOOT键:切换时间显示格式
  15. 对外接口:
  16. 1、time_page.draw():绘制时间显示页面
  17. 2、time_page.handle_key():处理时间页面按键事件
  18. 3、time_page.on_enter():页面进入时重置状态
  19. 4、time_page.on_leave():页面离开时执行清理操作
  20. ]]
  21. local time_page = {}
  22. -- 时间显示状态
  23. local time_state = {
  24. format_index = 1, -- 当前显示格式索引
  25. last_update = 0, -- 最后更新时间
  26. update_interval = 5000, -- 更新间隔(5秒)
  27. display_formats = { -- 时间显示格式列表
  28. { name = "Full Format", format = "%Y/%m/%d %H:%M:%S" },
  29. { name = "Short Format", format = "%Y-%m-%d %H:%M" },
  30. { name = "Time Only", format = "%H:%M:%S" },
  31. { name = "Date Only", format = "%Y/%m/%d" },
  32. { name = "Weekday", format = "%A %H:%M" },
  33. { name = "UTC Time", format = "!%Y-%m-%d %H:%M:%S" }
  34. }
  35. }
  36. --[[
  37. 获取当前时间字符串
  38. @local
  39. @return string 格式化后的时间字符串
  40. ]]
  41. local function get_time_string()
  42. local format_info = time_state.display_formats[time_state.format_index]
  43. return os.date(format_info.format)
  44. end
  45. --[[
  46. 绘制时间显示页面;
  47. 绘制时间显示页面的所有UI元素;
  48. @api time_page.draw()
  49. @summary 绘制时间显示页面的所有UI元素
  50. @return nil
  51. @usage
  52. -- 在UI主循环中调用
  53. time_page.draw()
  54. ]]
  55. function time_page.draw()
  56. -- 清除绘图缓冲区
  57. eink.clear(1, true)
  58. -- 显示标题
  59. eink.setFont(eink.font_opposansm22)
  60. eink.rect(10, 10, 190, 45, 0, 0) -- 标题背景框
  61. eink.print(30, 35, "Time Display", 0)
  62. eink.setFont(eink.font_opposansm16)
  63. -- 显示当前时间
  64. local time_str = get_time_string()
  65. -- 时间显示框
  66. eink.rect(15, 60, 185, 110, 0, 0)
  67. -- 显示时间
  68. eink.print(21, 90, time_str, 0)
  69. -- 显示格式信息
  70. eink.setFont(eink.font_opposansm12)
  71. local format_info = time_state.display_formats[time_state.format_index]
  72. eink.print(30, 130, "Format:", 0)
  73. eink.print(110, 130, format_info.name, 0)
  74. -- 显示格式索引
  75. eink.print(90, 145, string.format("%d/%d",
  76. time_state.format_index,
  77. #time_state.display_formats), 0)
  78. -- 绘制分隔线
  79. eink.line(10, 150, 190, 150, 0)
  80. -- 显示操作提示
  81. eink.print(35, 175, "BOOT:Change Format", 0)
  82. eink.print(35, 190, "PWR: Return to Home", 0)
  83. -- 刷新屏幕
  84. eink.show(0, 0, true)
  85. -- 更新最后更新时间
  86. time_state.last_update = mcu.ticks()
  87. end
  88. --[[
  89. 处理按键事件;
  90. 根据按键类型执行相应的操作;
  91. @api time_page.handle_key(key_type, switch_page)
  92. @summary 处理时间页面按键事件
  93. @string key_type 按键类型
  94. @valid_values "boot_up", "pwr_up"
  95. @function switch_page 页面切换回调函数
  96. @return bool 事件处理成功返回true,否则返回false
  97. @usage
  98. -- 在UI主循环中调用
  99. local handled = time_page.handle_key("boot_up", switch_page)
  100. ]]
  101. function time_page.handle_key(key_type, switch_page)
  102. log.info("time_page.handle_key", "key_type:", key_type)
  103. if key_type == "boot_up" then
  104. -- BOOT键:切换时间显示格式
  105. time_state.format_index = time_state.format_index % #time_state.display_formats + 1
  106. log.info("time_page", "切换到格式:", time_state.format_index)
  107. return true
  108. elseif key_type == "pwr_up" then
  109. -- PWR键:返回首页
  110. switch_page("home")
  111. return true
  112. end
  113. return false
  114. end
  115. --[[
  116. 检查是否需要更新时间;
  117. 基于时间间隔判断是否需要刷新显示;
  118. @api time_page.need_update()
  119. @summary 检查是否需要更新时间显示
  120. @return bool 需要更新返回true,否则返回false
  121. @usage
  122. -- 在UI主循环中调用
  123. if time_page.need_update() then
  124. time_page.draw()
  125. end
  126. ]]
  127. function time_page.need_update()
  128. local current_time = mcu.ticks()
  129. return (current_time - time_state.last_update) >= time_state.update_interval
  130. end
  131. --[[
  132. 页面进入时重置状态;
  133. @api time_page.on_enter()
  134. @summary 页面进入时重置状态
  135. @return nil
  136. @usage
  137. -- 在页面切换时调用
  138. time_page.on_enter()
  139. ]]
  140. function time_page.on_enter()
  141. time_state.format_index = 1
  142. time_state.last_update = 0
  143. log.info("time_page", "进入时间显示页面")
  144. end
  145. --[[
  146. 页面离开时执行清理操作;
  147. @api time_page.on_leave()
  148. @summary 页面离开时执行清理操作
  149. @return nil
  150. @usage
  151. -- 在页面切换时调用
  152. time_page.on_leave()
  153. ]]
  154. function time_page.on_leave()
  155. log.info("time_page", "离开时间显示页面")
  156. end
  157. return time_page