tsb_waveout_page.lua 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270
  1. --[[
  2. @module tsb_waveout_page
  3. @summary 波形输出页面
  4. @version 1.0
  5. @date 2026.03.18
  6. @author 李一玮
  7. @usage
  8. 本文件是波形输出页面,用于配置和控制波形输出。
  9. ]]
  10. local tsb_waveout_page = {}
  11. -- 页面UI元素
  12. local main_container = nil
  13. local common_ui = require("tsb_common_page")
  14. -- 配置参数
  15. local wave_type = "正弦波" -- 波形类型
  16. local amplitude = "5.0" -- 幅度(V)
  17. local frequency = "1000" -- 频率(Hz)
  18. local duty_cycle = "50" -- 占空比(%)
  19. local is_running = false -- 是否正在运行
  20. -- 创建数字键盘
  21. local function create_numeric_keyboard()
  22. return airui.keyboard({
  23. x = 0,
  24. y = 0,
  25. w = 480,
  26. h = 160,
  27. mode = "numeric",
  28. auto_hide = true,
  29. bg_color = 0xf1f1f1,
  30. on_commit = function()
  31. log.info("keyboard", "commit")
  32. end
  33. })
  34. end
  35. -- 创建UI
  36. function tsb_waveout_page.create_ui()
  37. main_container = airui.container({
  38. x = 0,
  39. y = 0,
  40. w = 480,
  41. h = 320,
  42. color = 0xF5F5F5,
  43. })
  44. --------------------- 标题栏 ------------------------
  45. local title_bar = airui.container({
  46. parent = main_container,
  47. x = 0,
  48. y = 0,
  49. w = 480,
  50. h = 30,
  51. color = 0x72DDF7,
  52. })
  53. airui.label({
  54. parent = title_bar,
  55. text = "波形输出",
  56. x = 200,
  57. y = 8,
  58. w = 80,
  59. h = 20,
  60. font_size = 16,
  61. color = 0xFFFFFF,
  62. })
  63. -- 标题栏公共信息展示
  64. common_ui.add_battery_display(title_bar)
  65. common_ui.create_back_button(title_bar, tsb_waveout_page.cleanup)
  66. ---------------------------------------------------
  67. -- 主容器
  68. local scroll_container = airui.container({
  69. parent = main_container,
  70. x = 0,
  71. y = 30,
  72. w = 480,
  73. h = 270,
  74. color = 0xF5F5F5,
  75. })
  76. -- 配置容器
  77. local config_container = airui.container({
  78. parent = scroll_container,
  79. x = 20,
  80. y = 20,
  81. w = 440,
  82. h = 180,
  83. color = 0xFFFFFF,
  84. radius = 8,
  85. border_width = 1,
  86. border_color = 0xDDDDDD,
  87. })
  88. local config_y = 20
  89. -- 波形类型
  90. airui.label({
  91. parent = config_container,
  92. text = "波形类型",
  93. x = 20,
  94. y = config_y,
  95. w = 80,
  96. h = 25,
  97. font_size = 14,
  98. color = 0x333333,
  99. })
  100. local wave_type_dropdown = airui.dropdown({
  101. parent = config_container,
  102. x = 100,
  103. y = config_y-8,
  104. w = 100,
  105. h = 35,
  106. options = {"正弦波", "方波", "三角波", "锯齿波"},
  107. default_index = 0,
  108. on_change = function(self, idx)
  109. local options = {"正弦波", "方波", "三角波", "锯齿波"}
  110. wave_type = options[idx + 1]
  111. log.info("waveout", "波形类型: " .. wave_type)
  112. end
  113. })
  114. config_y = config_y + 40
  115. -- 幅度(峰峰值)
  116. airui.label({
  117. parent = config_container,
  118. text = "幅度 (V)",
  119. x = 20,
  120. y = config_y,
  121. w = 80,
  122. h = 35,
  123. font_size = 14,
  124. color = 0x333333,
  125. })
  126. local amplitude_input = airui.textarea({
  127. parent = config_container,
  128. x = 100,
  129. y = config_y-8,
  130. w = 100,
  131. h = 35,
  132. text = "5.0",
  133. max_len = 5,
  134. keyboard = create_numeric_keyboard()
  135. })
  136. config_y = config_y + 40
  137. -- 频率
  138. airui.label({
  139. parent = config_container,
  140. text = "频率 (Hz)",
  141. x = 20,
  142. y = config_y,
  143. w = 80,
  144. h = 25,
  145. font_size = 14,
  146. color = 0x333333,
  147. })
  148. local frequency_input = airui.textarea({
  149. parent = config_container,
  150. x = 100,
  151. y = config_y-8,
  152. w = 100,
  153. h = 35,
  154. text = "1000",
  155. max_len = 6,
  156. keyboard = create_numeric_keyboard()
  157. })
  158. config_y = config_y + 40
  159. -- 占空比(仅方波可用)
  160. airui.label({
  161. parent = config_container,
  162. text = "占空比 (%)",
  163. x = 20,
  164. y = config_y,
  165. w = 80,
  166. h = 25,
  167. font_size = 14,
  168. color = 0x333333,
  169. })
  170. local duty_cycle_input = airui.textarea({
  171. parent = config_container,
  172. x = 100,
  173. y = config_y-8,
  174. w = 100,
  175. h = 35,
  176. text = "50",
  177. max_len = 3,
  178. keyboard = create_numeric_keyboard()
  179. })
  180. -- 控制按钮区域
  181. local button_container = airui.container({
  182. parent = scroll_container,
  183. x = 20,
  184. y = 210,
  185. w = 440,
  186. h = 40,
  187. color = 0xF5F5F5,
  188. })
  189. -- 开始按钮
  190. local start_btn = airui.button({
  191. parent = button_container,
  192. text = "开始",
  193. x = 100,
  194. y = 0,
  195. w = 100,
  196. h = 35,
  197. color = 0x4CAF50,
  198. text_color = 0xFFFFFF,
  199. stype = { bg_color = 0x2B6FF1,border_color = 0x2B6FF1, text_color = 0xFFFFFF, radius = 8 },
  200. on_click = function(self)
  201. if not is_running then
  202. is_running = true
  203. self:set_text("运行中")
  204. self:set_color(0xFF9800)
  205. -- 获取配置参数
  206. amplitude = amplitude_input:get_text()
  207. frequency = frequency_input:get_text()
  208. duty_cycle = duty_cycle_input:get_text()
  209. log.info("waveout", "开始输出波形", wave_type, amplitude, frequency, duty_cycle)
  210. -- 这里可以添加实际的波形输出代码
  211. end
  212. end
  213. })
  214. -- 停止按钮
  215. local stop_btn = airui.button({
  216. parent = button_container,
  217. text = "停止",
  218. x = 240,
  219. y = 0,
  220. w = 100,
  221. h = 35,
  222. color = 0xF44336,
  223. text_color = 0xFFFFFF,
  224. on_click = function(self)
  225. if is_running then
  226. is_running = false
  227. start_btn:set_text("开始")
  228. start_btn:set_color(0x4CAF50)
  229. log.info("waveout", "停止输出波形")
  230. -- 这里可以添加停止波形输出的代码
  231. end
  232. end
  233. })
  234. -- 底部信息
  235. common_ui.create_status_bar(main_container)
  236. end
  237. -- 初始化页面
  238. function tsb_waveout_page.init(params)
  239. tsb_waveout_page.create_ui()
  240. end
  241. -- 清理页面
  242. function tsb_waveout_page.cleanup()
  243. if main_container then
  244. main_container:destroy()
  245. main_container = nil
  246. end
  247. end
  248. return tsb_waveout_page