time_page.lua 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197
  1. --[[
  2. @module time_page
  3. @summary 时间显示演示模块
  4. @version 1.0
  5. @date 2025.12.18
  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 = "完整格式", format = "%Y年%m月%d日 %H:%M:%S"},
  29. {name = "简洁格式", format = "%Y-%m-%d %H:%M"},
  30. {name = "时间格式", format = "%H:%M:%S"},
  31. {name = "日期格式", format = "%Y/%m/%d"},
  32. {name = "星期格式", format = "%A %H:%M"},
  33. {name = "UTC时间", 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_opposansm12_chinese)
  60. eink.rect(10, 10, 190, 45, 0, 0) -- 标题背景框
  61. eink.print(70, 30, "时间显示", 0)
  62. -- 显示当前时间
  63. local time_str = get_time_string()
  64. -- 时间显示框
  65. eink.rect(20, 60, 180, 110, 0, 0)
  66. -- 统一使用12号中文字体显示时间
  67. eink.setFont(eink.font_opposansm12_chinese)
  68. -- 根据字符串长度微调显示位置
  69. if #time_str > 20 then
  70. -- 长字符串向左偏移
  71. eink.print(25, 85, time_str, 0)
  72. else
  73. -- 短字符串居中显示
  74. eink.print(30, 85, time_str, 0)
  75. end
  76. -- 显示格式信息
  77. local format_info = time_state.display_formats[time_state.format_index]
  78. eink.print(30, 130, "当前时间格式:", 0)
  79. eink.print(130, 130, format_info.name, 0)
  80. -- 显示格式索引
  81. eink.print(80, 145, string.format("%d/%d",
  82. time_state.format_index,
  83. #time_state.display_formats), 0)
  84. -- 绘制分隔线
  85. eink.line(10, 150, 190, 150, 0)
  86. -- 显示操作提示
  87. eink.print(55, 175, "BOOT键:切换格式", 0)
  88. eink.print(55, 190, "PWR键:返回主页", 0)
  89. -- 刷新屏幕
  90. eink.show(0, 0, true)
  91. -- 更新最后更新时间
  92. time_state.last_update = mcu.ticks()
  93. end
  94. --[[
  95. 处理按键事件;
  96. 根据按键类型执行相应的操作;
  97. @api time_page.handle_key(key_type, switch_page)
  98. @summary 处理时间页面按键事件
  99. @string key_type 按键类型
  100. @valid_values "boot_up", "pwr_up"
  101. @function switch_page 页面切换回调函数
  102. @return bool 事件处理成功返回true,否则返回false
  103. @usage
  104. -- 在UI主循环中调用
  105. local handled = time_page.handle_key("boot_up", switch_page)
  106. ]]
  107. function time_page.handle_key(key_type, switch_page)
  108. log.info("time_page.handle_key", "key_type:", key_type)
  109. if key_type == "boot_up" then
  110. -- BOOT键:切换时间显示格式
  111. time_state.format_index = time_state.format_index % #time_state.display_formats + 1
  112. log.info("time_page", "切换到格式:", time_state.format_index)
  113. return true
  114. elseif key_type == "pwr_up" then
  115. -- PWR键:返回首页
  116. switch_page("home")
  117. return true
  118. end
  119. return false
  120. end
  121. --[[
  122. 检查是否需要更新时间;
  123. 基于时间间隔判断是否需要刷新显示;
  124. @api time_page.need_update()
  125. @summary 检查是否需要更新时间显示
  126. @return bool 需要更新返回true,否则返回false
  127. @usage
  128. -- 在UI主循环中调用
  129. if time_page.need_update() then
  130. time_page.draw()
  131. end
  132. ]]
  133. function time_page.need_update()
  134. local current_time = mcu.ticks()
  135. return (current_time - time_state.last_update) >= time_state.update_interval
  136. end
  137. --[[
  138. 页面进入时重置状态;
  139. @api time_page.on_enter()
  140. @summary 页面进入时重置状态
  141. @return nil
  142. @usage
  143. -- 在页面切换时调用
  144. time_page.on_enter()
  145. ]]
  146. function time_page.on_enter()
  147. time_state.format_index = 1
  148. time_state.last_update = 0
  149. log.info("time_page", "进入时间显示页面")
  150. end
  151. --[[
  152. 页面离开时执行清理操作;
  153. @api time_page.on_leave()
  154. @summary 页面离开时执行清理操作
  155. @return nil
  156. @usage
  157. -- 在页面切换时调用
  158. time_page.on_leave()
  159. ]]
  160. function time_page.on_leave()
  161. log.info("time_page", "离开时间显示页面")
  162. end
  163. return time_page