My Marlin configs for Fabrikator Mini and CTC i3 Pro B
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

draw_ui.cpp 52KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428
  1. /**
  2. * Marlin 3D Printer Firmware
  3. * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
  4. *
  5. * Based on Sprinter and grbl.
  6. * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm
  7. *
  8. * This program is free software: you can redistribute it and/or modify
  9. * it under the terms of the GNU General Public License as published by
  10. * the Free Software Foundation, either version 3 of the License, or
  11. * (at your option) any later version.
  12. *
  13. * This program is distributed in the hope that it will be useful,
  14. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  15. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  16. * GNU General Public License for more details.
  17. *
  18. * You should have received a copy of the GNU General Public License
  19. * along with this program. If not, see <https://www.gnu.org/licenses/>.
  20. *
  21. */
  22. #include "../../../../inc/MarlinConfigPre.h"
  23. #if HAS_TFT_LVGL_UI
  24. #include "SPI_TFT.h"
  25. #include "tft_lvgl_configuration.h"
  26. #include "pic_manager.h"
  27. #include "draw_ui.h"
  28. #include "mks_hardware_test.h"
  29. #include <SPI.h>
  30. #include "../../../../MarlinCore.h" // for marlin_state
  31. #include "../../../../sd/cardreader.h"
  32. #include "../../../../module/motion.h"
  33. #include "../../../../module/planner.h"
  34. #include "../../../../inc/MarlinConfig.h"
  35. #if ENABLED(POWER_LOSS_RECOVERY)
  36. #include "../../../../feature/powerloss.h"
  37. #endif
  38. #if ENABLED(PARK_HEAD_ON_PAUSE)
  39. #include "../../../../feature/pause.h"
  40. #endif
  41. #if ENABLED(TOUCH_SCREEN_CALIBRATION)
  42. #include "draw_touch_calibration.h"
  43. #endif
  44. CFG_ITMES gCfgItems;
  45. UI_CFG uiCfg;
  46. DISP_STATE_STACK disp_state_stack;
  47. DISP_STATE disp_state = MAIN_UI;
  48. DISP_STATE last_disp_state;
  49. PRINT_TIME print_time;
  50. num_key_value_state value;
  51. keyboard_value_state keyboard_value;
  52. uint32_t To_pre_view;
  53. bool gcode_preview_over, flash_preview_begin, default_preview_flg;
  54. uint32_t size = 809;
  55. uint16_t row;
  56. bool temps_update_flag;
  57. uint8_t printing_rate_update_flag;
  58. extern bool once_flag;
  59. extern uint8_t sel_id;
  60. extern lv_group_t *g;
  61. extern void LCD_IO_WriteData(uint16_t RegValue);
  62. static const char custom_gcode_command[][100] = {
  63. "G29N\nM500",
  64. "G28",
  65. "G28",
  66. "G28",
  67. "G28"
  68. };
  69. lv_point_t line_points[4][2] = {
  70. {{PARA_UI_POS_X, PARA_UI_POS_Y + PARA_UI_SIZE_Y}, {TFT_WIDTH, PARA_UI_POS_Y + PARA_UI_SIZE_Y}},
  71. {{PARA_UI_POS_X, PARA_UI_POS_Y*2 + PARA_UI_SIZE_Y}, {TFT_WIDTH, PARA_UI_POS_Y*2 + PARA_UI_SIZE_Y}},
  72. {{PARA_UI_POS_X, PARA_UI_POS_Y*3 + PARA_UI_SIZE_Y}, {TFT_WIDTH, PARA_UI_POS_Y*3 + PARA_UI_SIZE_Y}},
  73. {{PARA_UI_POS_X, PARA_UI_POS_Y*4 + PARA_UI_SIZE_Y}, {TFT_WIDTH, PARA_UI_POS_Y*4 + PARA_UI_SIZE_Y}}
  74. };
  75. void gCfgItems_init() {
  76. gCfgItems.multiple_language = MULTI_LANGUAGE_ENABLE;
  77. #if 1 // LCD_LANGUAGE == en
  78. gCfgItems.language = LANG_ENGLISH;
  79. #elif LCD_LANGUAGE == zh_CN
  80. gCfgItems.language = LANG_SIMPLE_CHINESE;
  81. #elif LCD_LANGUAGE == zh_TW
  82. gCfgItems.language = LANG_COMPLEX_CHINESE;
  83. #elif LCD_LANGUAGE == jp_kana
  84. gCfgItems.language = LANG_JAPAN;
  85. #elif LCD_LANGUAGE == de
  86. gCfgItems.language = LANG_GERMAN;
  87. #elif LCD_LANGUAGE == fr
  88. gCfgItems.language = LANG_FRENCH;
  89. #elif LCD_LANGUAGE == ru
  90. gCfgItems.language = LANG_RUSSIAN;
  91. #elif LCD_LANGUAGE == ko_KR
  92. gCfgItems.language = LANG_KOREAN;
  93. #elif LCD_LANGUAGE == tr
  94. gCfgItems.language = LANG_TURKISH;
  95. #elif LCD_LANGUAGE == es
  96. gCfgItems.language = LANG_SPANISH;
  97. #elif LCD_LANGUAGE == el
  98. gCfgItems.language = LANG_GREEK;
  99. #elif LCD_LANGUAGE == it
  100. gCfgItems.language = LANG_ITALY;
  101. #elif LCD_LANGUAGE == pt
  102. gCfgItems.language = LANG_PORTUGUESE;
  103. #endif
  104. gCfgItems.leveling_mode = 0;
  105. gCfgItems.from_flash_pic = false;
  106. gCfgItems.curFilesize = 0;
  107. gCfgItems.finish_power_off = false;
  108. gCfgItems.pause_reprint = false;
  109. gCfgItems.pausePosX = -1;
  110. gCfgItems.pausePosY = -1;
  111. gCfgItems.pausePosZ = 5;
  112. gCfgItems.levelingPos[0][0] = X_MIN_POS + 30;
  113. gCfgItems.levelingPos[0][1] = Y_MIN_POS + 30;
  114. gCfgItems.levelingPos[1][0] = X_MAX_POS - 30;
  115. gCfgItems.levelingPos[1][1] = Y_MIN_POS + 30;
  116. gCfgItems.levelingPos[2][0] = X_MAX_POS - 30;
  117. gCfgItems.levelingPos[2][1] = Y_MAX_POS - 30;
  118. gCfgItems.levelingPos[3][0] = X_MIN_POS + 30;
  119. gCfgItems.levelingPos[3][1] = Y_MAX_POS - 30;
  120. gCfgItems.levelingPos[4][0] = X_BED_SIZE / 2;
  121. gCfgItems.levelingPos[4][1] = Y_BED_SIZE / 2;
  122. gCfgItems.cloud_enable = false;
  123. gCfgItems.wifi_mode_sel = STA_MODEL;
  124. gCfgItems.fileSysType = FILE_SYS_SD;
  125. gCfgItems.wifi_type = ESP_WIFI;
  126. gCfgItems.filamentchange_load_length = 200;
  127. gCfgItems.filamentchange_load_speed = 1000;
  128. gCfgItems.filamentchange_unload_length = 200;
  129. gCfgItems.filamentchange_unload_speed = 1000;
  130. gCfgItems.filament_limit_temp = 200;
  131. gCfgItems.encoder_enable = true;
  132. W25QXX.SPI_FLASH_BufferRead((uint8_t *)&gCfgItems.spi_flash_flag, VAR_INF_ADDR, sizeof(gCfgItems.spi_flash_flag));
  133. if (gCfgItems.spi_flash_flag == FLASH_INF_VALID_FLAG) {
  134. W25QXX.SPI_FLASH_BufferRead((uint8_t *)&gCfgItems, VAR_INF_ADDR, sizeof(gCfgItems));
  135. }
  136. else {
  137. gCfgItems.spi_flash_flag = FLASH_INF_VALID_FLAG;
  138. W25QXX.SPI_FLASH_SectorErase(VAR_INF_ADDR);
  139. W25QXX.SPI_FLASH_BufferWrite((uint8_t *)&gCfgItems, VAR_INF_ADDR, sizeof(gCfgItems));
  140. //init gcode command
  141. W25QXX.SPI_FLASH_BufferWrite((uint8_t *)&custom_gcode_command[0], AUTO_LEVELING_COMMAND_ADDR, 100);
  142. W25QXX.SPI_FLASH_BufferWrite((uint8_t *)&custom_gcode_command[1], OTHERS_COMMAND_ADDR_1, 100);
  143. W25QXX.SPI_FLASH_BufferWrite((uint8_t *)&custom_gcode_command[2], OTHERS_COMMAND_ADDR_2, 100);
  144. W25QXX.SPI_FLASH_BufferWrite((uint8_t *)&custom_gcode_command[3], OTHERS_COMMAND_ADDR_3, 100);
  145. W25QXX.SPI_FLASH_BufferWrite((uint8_t *)&custom_gcode_command[4], OTHERS_COMMAND_ADDR_4, 100);
  146. }
  147. const byte rot = (TFT_ROTATION & TFT_ROTATE_180) ? 0xEE : 0x00;
  148. if (gCfgItems.disp_rotation_180 != rot) {
  149. gCfgItems.disp_rotation_180 = rot;
  150. update_spi_flash();
  151. }
  152. uiCfg.F[0] = 'N';
  153. uiCfg.F[1] = 'A';
  154. uiCfg.F[2] = 'N';
  155. uiCfg.F[3] = 'O';
  156. W25QXX.SPI_FLASH_BlockErase(REFLSHE_FLGA_ADD + 32 - 64*1024);
  157. W25QXX.SPI_FLASH_BufferWrite(uiCfg.F,REFLSHE_FLGA_ADD,4);
  158. }
  159. void ui_cfg_init() {
  160. uiCfg.curTempType = 0;
  161. uiCfg.extruderIndex = 0;
  162. uiCfg.stepHeat = 10;
  163. uiCfg.leveling_first_time = false;
  164. uiCfg.para_ui_page = false;
  165. uiCfg.extruStep = 5;
  166. uiCfg.extruSpeed = 10;
  167. uiCfg.move_dist = 1;
  168. uiCfg.moveSpeed = 3000;
  169. uiCfg.stepPrintSpeed = 10;
  170. uiCfg.command_send = false;
  171. uiCfg.dialogType = 0;
  172. uiCfg.filament_heat_completed_load = false;
  173. uiCfg.filament_rate = 0;
  174. uiCfg.filament_loading_completed = false;
  175. uiCfg.filament_unloading_completed = false;
  176. uiCfg.filament_loading_time_flg = false;
  177. uiCfg.filament_loading_time_cnt = 0;
  178. uiCfg.filament_unloading_time_flg = false;
  179. uiCfg.filament_unloading_time_cnt = 0;
  180. #if ENABLED(MKS_WIFI_MODULE)
  181. memset(&wifiPara, 0, sizeof(wifiPara));
  182. memset(&ipPara, 0, sizeof(ipPara));
  183. strcpy(wifiPara.ap_name, WIFI_AP_NAME);
  184. strcpy(wifiPara.keyCode, WIFI_KEY_CODE);
  185. //client
  186. strcpy(ipPara.ip_addr, IP_ADDR);
  187. strcpy(ipPara.mask, IP_MASK);
  188. strcpy(ipPara.gate, IP_GATE);
  189. strcpy(ipPara.dns, IP_DNS);
  190. ipPara.dhcp_flag = IP_DHCP_FLAG;
  191. //AP
  192. strcpy(ipPara.dhcpd_ip, AP_IP_ADDR);
  193. strcpy(ipPara.dhcpd_mask, AP_IP_MASK);
  194. strcpy(ipPara.dhcpd_gate, AP_IP_GATE);
  195. strcpy(ipPara.dhcpd_dns, AP_IP_DNS);
  196. strcpy(ipPara.start_ip_addr, IP_START_IP);
  197. strcpy(ipPara.end_ip_addr, IP_END_IP);
  198. ipPara.dhcpd_flag = AP_IP_DHCP_FLAG;
  199. strcpy((char*)uiCfg.cloud_hostUrl, "baizhongyun.cn");
  200. uiCfg.cloud_port = 10086;
  201. #endif
  202. uiCfg.filament_loading_time = (uint32_t)((gCfgItems.filamentchange_load_length * 60.0f / gCfgItems.filamentchange_load_speed) + 0.5f);
  203. uiCfg.filament_unloading_time = (uint32_t)((gCfgItems.filamentchange_unload_length * 60.0f / gCfgItems.filamentchange_unload_speed) + 0.5f);
  204. }
  205. void update_spi_flash() {
  206. uint8_t command_buf[512];
  207. W25QXX.init(SPI_QUARTER_SPEED);
  208. //read back the gcode command befor erase spi flash
  209. W25QXX.SPI_FLASH_BufferRead((uint8_t *)&command_buf, GCODE_COMMAND_ADDR, sizeof(command_buf));
  210. W25QXX.SPI_FLASH_SectorErase(VAR_INF_ADDR);
  211. W25QXX.SPI_FLASH_BufferWrite((uint8_t *)&gCfgItems, VAR_INF_ADDR, sizeof(gCfgItems));
  212. W25QXX.SPI_FLASH_BufferWrite((uint8_t *)&command_buf, GCODE_COMMAND_ADDR, sizeof(command_buf));
  213. }
  214. void update_gcode_command(int addr,uint8_t *s) {
  215. uint8_t command_buf[512];
  216. W25QXX.init(SPI_QUARTER_SPEED);
  217. //read back the gcode command befor erase spi flash
  218. W25QXX.SPI_FLASH_BufferRead((uint8_t *)&command_buf, GCODE_COMMAND_ADDR, sizeof(command_buf));
  219. W25QXX.SPI_FLASH_SectorErase(VAR_INF_ADDR);
  220. W25QXX.SPI_FLASH_BufferWrite((uint8_t *)&gCfgItems, VAR_INF_ADDR, sizeof(gCfgItems));
  221. switch (addr) {
  222. case AUTO_LEVELING_COMMAND_ADDR: memcpy(&command_buf[0*100], s, 100); break;
  223. case OTHERS_COMMAND_ADDR_1: memcpy(&command_buf[1*100], s, 100); break;
  224. case OTHERS_COMMAND_ADDR_2: memcpy(&command_buf[2*100], s, 100); break;
  225. case OTHERS_COMMAND_ADDR_3: memcpy(&command_buf[3*100], s, 100); break;
  226. case OTHERS_COMMAND_ADDR_4: memcpy(&command_buf[4*100], s, 100); break;
  227. default: break;
  228. }
  229. W25QXX.SPI_FLASH_BufferWrite((uint8_t *)&command_buf, GCODE_COMMAND_ADDR, sizeof(command_buf));
  230. }
  231. void get_gcode_command(int addr,uint8_t *d) {
  232. W25QXX.init(SPI_QUARTER_SPEED);
  233. W25QXX.SPI_FLASH_BufferRead((uint8_t *)d, addr, 100);
  234. }
  235. lv_style_t tft_style_scr;
  236. lv_style_t tft_style_label_pre;
  237. lv_style_t tft_style_label_rel;
  238. lv_style_t style_line;
  239. lv_style_t style_para_value_pre;
  240. lv_style_t style_para_value_rel;
  241. lv_style_t style_num_key_pre;
  242. lv_style_t style_num_key_rel;
  243. lv_style_t style_num_text;
  244. lv_style_t style_sel_text;
  245. lv_style_t style_para_value;
  246. lv_style_t style_para_back;
  247. lv_style_t lv_bar_style_indic;
  248. lv_style_t style_btn_pr;
  249. lv_style_t style_btn_rel;
  250. void tft_style_init() {
  251. lv_style_copy(&tft_style_scr, &lv_style_scr);
  252. tft_style_scr.body.main_color = LV_COLOR_BACKGROUND;
  253. tft_style_scr.body.grad_color = LV_COLOR_BACKGROUND;
  254. tft_style_scr.text.color = LV_COLOR_TEXT;
  255. tft_style_scr.text.sel_color = LV_COLOR_TEXT;
  256. tft_style_scr.line.width = 0;
  257. tft_style_scr.text.letter_space = 0;
  258. tft_style_scr.text.line_space = 0;
  259. lv_style_copy(&tft_style_label_pre, &lv_style_scr);
  260. lv_style_copy(&tft_style_label_rel, &lv_style_scr);
  261. tft_style_label_pre.body.main_color = LV_COLOR_BACKGROUND;
  262. tft_style_label_pre.body.grad_color = LV_COLOR_BACKGROUND;
  263. tft_style_label_pre.text.color = LV_COLOR_TEXT;
  264. tft_style_label_pre.text.sel_color = LV_COLOR_TEXT;
  265. tft_style_label_rel.body.main_color = LV_COLOR_BACKGROUND;
  266. tft_style_label_rel.body.grad_color = LV_COLOR_BACKGROUND;
  267. tft_style_label_rel.text.color = LV_COLOR_TEXT;
  268. tft_style_label_rel.text.sel_color = LV_COLOR_TEXT;
  269. tft_style_label_pre.text.font = TERN(HAS_SPI_FLASH_FONT, &gb2312_puhui32, LV_FONT_DEFAULT);
  270. tft_style_label_rel.text.font = TERN(HAS_SPI_FLASH_FONT, &gb2312_puhui32, LV_FONT_DEFAULT);
  271. tft_style_label_pre.line.width = 0;
  272. tft_style_label_rel.line.width = 0;
  273. tft_style_label_pre.text.letter_space = 0;
  274. tft_style_label_rel.text.letter_space = 0;
  275. tft_style_label_pre.text.line_space = -5;
  276. tft_style_label_rel.text.line_space = -5;
  277. lv_style_copy(&style_para_value_pre, &lv_style_scr);
  278. lv_style_copy(&style_para_value_rel, &lv_style_scr);
  279. style_para_value_pre.body.main_color = LV_COLOR_BACKGROUND;
  280. style_para_value_pre.body.grad_color = LV_COLOR_BACKGROUND;
  281. style_para_value_pre.text.color = LV_COLOR_TEXT;
  282. style_para_value_pre.text.sel_color = LV_COLOR_TEXT;
  283. style_para_value_rel.body.main_color = LV_COLOR_BACKGROUND;
  284. style_para_value_rel.body.grad_color = LV_COLOR_BACKGROUND;
  285. style_para_value_rel.text.color = LV_COLOR_BLACK;
  286. style_para_value_rel.text.sel_color = LV_COLOR_BLACK;
  287. style_para_value_pre.text.font = TERN(HAS_SPI_FLASH_FONT, &gb2312_puhui32, LV_FONT_DEFAULT);
  288. style_para_value_rel.text.font = TERN(HAS_SPI_FLASH_FONT, &gb2312_puhui32, LV_FONT_DEFAULT);
  289. style_para_value_pre.line.width = 0;
  290. style_para_value_rel.line.width = 0;
  291. style_para_value_pre.text.letter_space = 0;
  292. style_para_value_rel.text.letter_space = 0;
  293. style_para_value_pre.text.line_space = -5;
  294. style_para_value_rel.text.line_space = -5;
  295. lv_style_copy(&style_num_key_pre, &lv_style_scr);
  296. lv_style_copy(&style_num_key_rel, &lv_style_scr);
  297. style_num_key_pre.body.main_color = LV_COLOR_KEY_BACKGROUND;
  298. style_num_key_pre.body.grad_color = LV_COLOR_KEY_BACKGROUND;
  299. style_num_key_pre.text.color = LV_COLOR_TEXT;
  300. style_num_key_pre.text.sel_color = LV_COLOR_TEXT;
  301. style_num_key_rel.body.main_color = LV_COLOR_KEY_BACKGROUND;
  302. style_num_key_rel.body.grad_color = LV_COLOR_KEY_BACKGROUND;
  303. style_num_key_rel.text.color = LV_COLOR_TEXT;
  304. style_num_key_rel.text.sel_color = LV_COLOR_TEXT;
  305. #if HAS_SPI_FLASH_FONT
  306. style_num_key_pre.text.font = &gb2312_puhui32;
  307. style_num_key_rel.text.font = &gb2312_puhui32;
  308. #else
  309. style_num_key_pre.text.font = LV_FONT_DEFAULT;
  310. style_num_key_rel.text.font = LV_FONT_DEFAULT;
  311. #endif
  312. style_num_key_pre.line.width = 0;
  313. style_num_key_rel.line.width = 0;
  314. style_num_key_pre.text.letter_space = 0;
  315. style_num_key_rel.text.letter_space = 0;
  316. style_num_key_pre.text.line_space = -5;
  317. style_num_key_rel.text.line_space = -5;
  318. lv_style_copy(&style_num_text, &lv_style_scr);
  319. style_num_text.body.main_color = LV_COLOR_WHITE;
  320. style_num_text.body.grad_color = LV_COLOR_WHITE;
  321. style_num_text.text.color = LV_COLOR_BLACK;
  322. style_num_text.text.sel_color = LV_COLOR_BLACK;
  323. style_num_text.text.font = TERN(HAS_SPI_FLASH_FONT, &gb2312_puhui32, LV_FONT_DEFAULT);
  324. style_num_text.line.width = 0;
  325. style_num_text.text.letter_space = 0;
  326. style_num_text.text.line_space = -5;
  327. lv_style_copy(&style_sel_text, &lv_style_scr);
  328. style_sel_text.body.main_color = LV_COLOR_BACKGROUND;
  329. style_sel_text.body.grad_color = LV_COLOR_BACKGROUND;
  330. style_sel_text.text.color = LV_COLOR_YELLOW;
  331. style_sel_text.text.sel_color = LV_COLOR_YELLOW;
  332. style_sel_text.text.font = &gb2312_puhui32;
  333. style_sel_text.line.width = 0;
  334. style_sel_text.text.letter_space = 0;
  335. style_sel_text.text.line_space = -5;
  336. lv_style_copy(&style_line, &lv_style_plain);
  337. style_line.line.color = LV_COLOR_MAKE(0x49, 0x54, 0xFF);
  338. style_line.line.width = 1;
  339. style_line.line.rounded = 1;
  340. lv_style_copy(&style_para_value, &lv_style_plain);
  341. style_para_value.body.border.color = LV_COLOR_BACKGROUND;
  342. style_para_value.body.border.width = 1;
  343. style_para_value.body.main_color = LV_COLOR_WHITE;
  344. style_para_value.body.grad_color = LV_COLOR_WHITE;
  345. style_para_value.body.shadow.width = 0;
  346. style_para_value.body.radius = 3;
  347. style_para_value.text.color = LV_COLOR_BLACK;
  348. style_para_value.text.font = &TERN(HAS_SPI_FLASH_FONT, gb2312_puhui32, lv_font_roboto_22);
  349. lv_style_copy(&style_para_back, &lv_style_plain);
  350. style_para_back.body.border.color = LV_COLOR_BACKGROUND;
  351. style_para_back.body.border.width = 1;
  352. style_para_back.body.main_color = TFT_LV_PARA_BACK_BODY_COLOR;
  353. style_para_back.body.grad_color = TFT_LV_PARA_BACK_BODY_COLOR;
  354. style_para_back.body.shadow.width = 0;
  355. style_para_back.body.radius = 3;
  356. style_para_back.text.color = LV_COLOR_WHITE;
  357. style_para_back.text.font = &TERN(HAS_SPI_FLASH_FONT, gb2312_puhui32, lv_font_roboto_22);
  358. lv_style_copy(&style_btn_rel, &lv_style_plain);
  359. style_btn_rel.body.border.color = lv_color_hex3(0x269);
  360. style_btn_rel.body.border.width = 1;
  361. style_btn_rel.body.main_color = lv_color_hex3(0xADF);
  362. style_btn_rel.body.grad_color = lv_color_hex3(0x46B);
  363. style_btn_rel.body.shadow.width = 4;
  364. style_btn_rel.body.shadow.type = LV_SHADOW_BOTTOM;
  365. style_btn_rel.body.radius = LV_RADIUS_CIRCLE;
  366. style_btn_rel.text.color = lv_color_hex3(0xDEF);
  367. style_btn_rel.text.font = &TERN(HAS_SPI_FLASH_FONT, gb2312_puhui32, lv_font_roboto_22);
  368. lv_style_copy(&style_btn_pr, &style_btn_rel);
  369. style_btn_pr.body.border.color = lv_color_hex3(0x46B);
  370. style_btn_pr.body.main_color = lv_color_hex3(0x8BD);
  371. style_btn_pr.body.grad_color = lv_color_hex3(0x24A);
  372. style_btn_pr.body.shadow.width = 2;
  373. style_btn_pr.text.color = lv_color_hex3(0xBCD);
  374. style_btn_pr.text.font = &TERN(HAS_SPI_FLASH_FONT, gb2312_puhui32, lv_font_roboto_22);
  375. lv_style_copy(&lv_bar_style_indic, &lv_style_pretty_color);
  376. lv_bar_style_indic.text.color = lv_color_hex3(0xADF);
  377. lv_bar_style_indic.image.color = lv_color_hex3(0xADF);
  378. lv_bar_style_indic.line.color = lv_color_hex3(0xADF);
  379. lv_bar_style_indic.body.main_color = lv_color_hex3(0xADF);
  380. lv_bar_style_indic.body.grad_color = lv_color_hex3(0xADF);
  381. lv_bar_style_indic.body.border.color = lv_color_hex3(0xADF);
  382. }
  383. #define MAX_TITLE_LEN 28
  384. char public_buf_m[100] = {0};
  385. char public_buf_l[30];
  386. void titleText_cat(char *str, int strSize, char *addPart) {
  387. if (str == 0 || addPart == 0) return;
  388. if ((int)(strlen(str) + strlen(addPart)) >= strSize) return;
  389. strcat(str, addPart);
  390. }
  391. char *getDispText(int index) {
  392. ZERO(public_buf_l);
  393. switch (disp_state_stack._disp_state[index]) {
  394. case PRINT_READY_UI:
  395. strcpy(public_buf_l, main_menu.title);
  396. break;
  397. case PRINT_FILE_UI:
  398. strcpy(public_buf_l, file_menu.title);
  399. break;
  400. case PRINTING_UI:
  401. if (disp_state_stack._disp_state[disp_state_stack._disp_index] == PRINTING_UI
  402. #ifndef TFT35
  403. || disp_state_stack._disp_state[disp_state_stack._disp_index] == OPERATE_UI
  404. || disp_state_stack._disp_state[disp_state_stack._disp_index] == PAUSE_UI
  405. #endif
  406. ) strcpy(public_buf_l, common_menu.print_special_title);
  407. else strcpy(public_buf_l, printing_menu.title);
  408. break;
  409. case MOVE_MOTOR_UI:
  410. strcpy(public_buf_l, move_menu.title);
  411. break;
  412. case OPERATE_UI:
  413. if (disp_state_stack._disp_state[disp_state_stack._disp_index] == PRINTING_UI
  414. #ifndef TFT35
  415. || disp_state_stack._disp_state[disp_state_stack._disp_index] == OPERATE_UI
  416. || disp_state_stack._disp_state[disp_state_stack._disp_index] == PAUSE_UI
  417. #endif
  418. ) strcpy(public_buf_l, common_menu.operate_special_title);
  419. else strcpy(public_buf_l, operation_menu.title);
  420. break;
  421. case PAUSE_UI:
  422. if (disp_state_stack._disp_state[disp_state_stack._disp_index] == PRINTING_UI
  423. || disp_state_stack._disp_state[disp_state_stack._disp_index] == OPERATE_UI
  424. || disp_state_stack._disp_state[disp_state_stack._disp_index] == PAUSE_UI
  425. ) strcpy(public_buf_l, common_menu.pause_special_title);
  426. else strcpy(public_buf_l, pause_menu.title);
  427. break;
  428. case EXTRUSION_UI:
  429. strcpy(public_buf_l, extrude_menu.title);
  430. break;
  431. case CHANGE_SPEED_UI:
  432. strcpy(public_buf_l, speed_menu.title);
  433. break;
  434. case FAN_UI:
  435. strcpy(public_buf_l, fan_menu.title);
  436. break;
  437. case PRE_HEAT_UI:
  438. if ((disp_state_stack._disp_state[disp_state_stack._disp_index - 1] == OPERATE_UI))
  439. strcpy(public_buf_l, preheat_menu.adjust_title);
  440. else strcpy(public_buf_l, preheat_menu.title);
  441. break;
  442. case SET_UI:
  443. strcpy(public_buf_l, set_menu.title);
  444. break;
  445. case ZERO_UI:
  446. strcpy(public_buf_l, home_menu.title);
  447. break;
  448. case SPRAYER_UI: break;
  449. case MACHINE_UI: break;
  450. case LANGUAGE_UI:
  451. strcpy(public_buf_l, language_menu.title);
  452. break;
  453. case ABOUT_UI:
  454. strcpy(public_buf_l, about_menu.title);
  455. break;
  456. case LOG_UI: break;
  457. case DISK_UI:
  458. strcpy(public_buf_l, filesys_menu.title);
  459. break;
  460. case DIALOG_UI:
  461. strcpy(public_buf_l, common_menu.dialog_confirm_title);
  462. break;
  463. case WIFI_UI:
  464. strcpy(public_buf_l, wifi_menu.title);
  465. break;
  466. case MORE_UI:
  467. case PRINT_MORE_UI:
  468. strcpy(public_buf_l, more_menu.title);
  469. break;
  470. case FILAMENTCHANGE_UI:
  471. strcpy(public_buf_l, filament_menu.title);
  472. break;
  473. case LEVELING_UI:
  474. case MESHLEVELING_UI:
  475. strcpy(public_buf_l, leveling_menu.title);
  476. break;
  477. case BIND_UI:
  478. strcpy(public_buf_l, cloud_menu.title);
  479. break;
  480. case TOOL_UI:
  481. strcpy(public_buf_l, tool_menu.title);
  482. break;
  483. case WIFI_LIST_UI:
  484. #if ENABLED(MKS_WIFI_MODULE)
  485. strcpy(public_buf_l, list_menu.title);
  486. break;
  487. #endif
  488. case MACHINE_PARA_UI:
  489. strcpy(public_buf_l, MachinePara_menu.title);
  490. break;
  491. case BABY_STEP_UI:
  492. strcpy(public_buf_l, operation_menu.babystep);
  493. break;
  494. case EEPROM_SETTINGS_UI:
  495. strcpy(public_buf_l, eeprom_menu.title);
  496. break;
  497. default: break;
  498. }
  499. return public_buf_l;
  500. }
  501. char *creat_title_text() {
  502. int index = 0;
  503. char *tmpText = 0;
  504. char tmpCurFileStr[20];
  505. ZERO(tmpCurFileStr);
  506. cutFileName(list_file.long_name[sel_id], 16, 16, tmpCurFileStr);
  507. ZERO(public_buf_m);
  508. while (index <= disp_state_stack._disp_index) {
  509. tmpText = getDispText(index);
  510. if ((*tmpText == 0) || (tmpText == 0)) {
  511. index++;
  512. continue;
  513. }
  514. titleText_cat(public_buf_m, sizeof(public_buf_m), tmpText);
  515. if (index < disp_state_stack._disp_index) titleText_cat(public_buf_m, sizeof(public_buf_m), (char *)">");
  516. index++;
  517. }
  518. if (disp_state_stack._disp_state[disp_state_stack._disp_index] == PRINTING_UI) {
  519. titleText_cat(public_buf_m, sizeof(public_buf_m), (char *)":");
  520. titleText_cat(public_buf_m, sizeof(public_buf_m), tmpCurFileStr);
  521. }
  522. if (strlen(public_buf_m) > MAX_TITLE_LEN) {
  523. ZERO(public_buf_m);
  524. tmpText = 0;
  525. for (index = 0; index <= disp_state_stack._disp_index && (!tmpText || *tmpText == 0); index++)
  526. tmpText = getDispText(index);
  527. if (*tmpText != 0) {
  528. titleText_cat(public_buf_m, sizeof(public_buf_m), tmpText);
  529. titleText_cat(public_buf_m, sizeof(public_buf_m), (char *)">...>");
  530. tmpText = getDispText(disp_state_stack._disp_index);
  531. if (*tmpText != 0) titleText_cat(public_buf_m, sizeof(public_buf_m), tmpText);
  532. }
  533. }
  534. return public_buf_m;
  535. }
  536. #if HAS_GCODE_PREVIEW
  537. uint32_t gPicturePreviewStart = 0;
  538. void preview_gcode_prehandle(char *path) {
  539. #if ENABLED(SDSUPPORT)
  540. uint32_t pre_read_cnt = 0;
  541. uint32_t *p1;
  542. char *cur_name;
  543. gPicturePreviewStart = 0;
  544. cur_name = strrchr(path, '/');
  545. card.openFileRead(cur_name);
  546. card.read(public_buf, 512);
  547. p1 = (uint32_t *)strstr((char *)public_buf, ";simage:");
  548. if (p1) {
  549. pre_read_cnt = (uint32_t)p1 - (uint32_t)((uint32_t *)(&public_buf[0]));
  550. To_pre_view = pre_read_cnt;
  551. gcode_preview_over = true;
  552. gCfgItems.from_flash_pic = true;
  553. update_spi_flash();
  554. }
  555. else {
  556. gcode_preview_over = false;
  557. default_preview_flg = true;
  558. gCfgItems.from_flash_pic = false;
  559. update_spi_flash();
  560. }
  561. card.closefile();
  562. #endif
  563. }
  564. void gcode_preview(char *path, int xpos_pixel, int ypos_pixel) {
  565. #if ENABLED(SDSUPPORT)
  566. volatile uint32_t i, j;
  567. volatile uint16_t *p_index;
  568. char *cur_name;
  569. cur_name = strrchr(path, '/');
  570. card.openFileRead(cur_name);
  571. if (gPicturePreviewStart <= 0) {
  572. while (1) {
  573. uint32_t br = card.read(public_buf, 400);
  574. uint32_t* p1 = (uint32_t *)strstr((char *)public_buf, ";gimage:");
  575. if (p1) {
  576. gPicturePreviewStart += (uint32_t)p1 - (uint32_t)((uint32_t *)(&public_buf[0]));
  577. break;
  578. }
  579. else {
  580. gPicturePreviewStart += br;
  581. }
  582. if (br < 400) break;
  583. }
  584. }
  585. card.setIndex(gPicturePreviewStart + size * row + 8);
  586. SPI_TFT.setWindow(xpos_pixel, ypos_pixel + row, 200, 1);
  587. j = i = 0;
  588. while (1) {
  589. card.read(public_buf, 400);
  590. for (i = 0; i < 400;) {
  591. bmp_public_buf[j] = ascii2dec_test((char*)&public_buf[i]) << 4 | ascii2dec_test((char*)&public_buf[i + 1]);
  592. i += 2;
  593. j++;
  594. }
  595. if (j >= 400) break;
  596. }
  597. for (i = 0; i < 400; i += 2) {
  598. p_index = (uint16_t *)(&bmp_public_buf[i]);
  599. if (*p_index == 0x0000) *p_index = LV_COLOR_BACKGROUND.full;
  600. }
  601. SPI_TFT.tftio.WriteSequence((uint16_t*)bmp_public_buf, 200);
  602. #if HAS_BAK_VIEW_IN_FLASH
  603. W25QXX.init(SPI_QUARTER_SPEED);
  604. if (row < 20) W25QXX.SPI_FLASH_SectorErase(BAK_VIEW_ADDR_TFT35 + row * 4096);
  605. W25QXX.SPI_FLASH_BufferWrite(bmp_public_buf, BAK_VIEW_ADDR_TFT35 + row * 400, 400);
  606. #endif
  607. row++;
  608. if (row >= 200) {
  609. size = 809;
  610. row = 0;
  611. gcode_preview_over = false;
  612. card.closefile();
  613. char *cur_name;
  614. cur_name = strrchr(list_file.file_name[sel_id], '/');
  615. SdFile file;
  616. SdFile *curDir;
  617. card.endFilePrint();
  618. const char * const fname = card.diveToFile(true, curDir, cur_name);
  619. if (!fname) return;
  620. if (file.open(curDir, fname, O_READ)) {
  621. gCfgItems.curFilesize = file.fileSize();
  622. file.close();
  623. update_spi_flash();
  624. }
  625. card.openFileRead(cur_name);
  626. if (card.isFileOpen()) {
  627. feedrate_percentage = 100;
  628. planner.flow_percentage[0] = 100;
  629. planner.e_factor[0] = planner.flow_percentage[0] * 0.01;
  630. #if HAS_MULTI_EXTRUDER
  631. planner.flow_percentage[1] = 100;
  632. planner.e_factor[1] = planner.flow_percentage[1] * 0.01;
  633. #endif
  634. card.startFileprint();
  635. TERN_(POWER_LOSS_RECOVERY, recovery.prepare());
  636. once_flag = false;
  637. }
  638. return;
  639. }
  640. card.closefile();
  641. #endif // SDSUPPORT
  642. }
  643. void draw_default_preview(int xpos_pixel, int ypos_pixel, uint8_t sel) {
  644. int index;
  645. int y_off = 0;
  646. W25QXX.init(SPI_QUARTER_SPEED);
  647. for (index = 0; index < 10; index++) { // 200*200
  648. #if HAS_BAK_VIEW_IN_FLASH
  649. if (sel == 1) {
  650. flash_view_Read(bmp_public_buf, 8000); // 20k
  651. }
  652. else {
  653. default_view_Read(bmp_public_buf, DEFAULT_VIEW_MAX_SIZE / 10); // 8k
  654. }
  655. #else
  656. default_view_Read(bmp_public_buf, DEFAULT_VIEW_MAX_SIZE / 10); // 8k
  657. #endif
  658. SPI_TFT.setWindow(xpos_pixel, y_off * 20 + ypos_pixel, 200, 20); // 200*200
  659. SPI_TFT.tftio.WriteSequence((uint16_t*)(bmp_public_buf), DEFAULT_VIEW_MAX_SIZE / 20);
  660. y_off++;
  661. }
  662. W25QXX.init(SPI_QUARTER_SPEED);
  663. }
  664. void disp_pre_gcode(int xpos_pixel, int ypos_pixel) {
  665. if (gcode_preview_over) gcode_preview(list_file.file_name[sel_id], xpos_pixel, ypos_pixel);
  666. #if HAS_BAK_VIEW_IN_FLASH
  667. if (flash_preview_begin) {
  668. flash_preview_begin = false;
  669. draw_default_preview(xpos_pixel, ypos_pixel, 1);
  670. }
  671. #endif
  672. #if HAS_GCODE_DEFAULT_VIEW_IN_FLASH
  673. if (default_preview_flg) {
  674. draw_default_preview(xpos_pixel, ypos_pixel, 0);
  675. default_preview_flg = false;
  676. }
  677. #endif
  678. }
  679. #endif // HAS_GCODE_PREVIEW
  680. void print_time_run() {
  681. static uint8_t lastSec = 0;
  682. if (print_time.seconds >= 60) {
  683. print_time.seconds = 0;
  684. print_time.minutes++;
  685. if (print_time.minutes >= 60) {
  686. print_time.minutes = 0;
  687. print_time.hours++;
  688. }
  689. }
  690. if (disp_state == PRINTING_UI) {
  691. if (lastSec != print_time.seconds) disp_print_time();
  692. lastSec = print_time.seconds;
  693. }
  694. }
  695. void GUI_RefreshPage() {
  696. if ((systick_uptime_millis % 1000) == 0) temps_update_flag = true;
  697. if ((systick_uptime_millis % 3000) == 0) printing_rate_update_flag = true;
  698. switch (disp_state) {
  699. case MAIN_UI:
  700. break;
  701. case EXTRUSION_UI:
  702. if (temps_update_flag) {
  703. temps_update_flag = false;
  704. disp_hotend_temp();
  705. }
  706. break;
  707. case PRE_HEAT_UI:
  708. if (temps_update_flag) {
  709. temps_update_flag = false;
  710. disp_desire_temp();
  711. }
  712. break;
  713. case PRINT_READY_UI:
  714. break;
  715. case PRINT_FILE_UI: break;
  716. case PRINTING_UI:
  717. if (temps_update_flag) {
  718. temps_update_flag = false;
  719. disp_ext_temp();
  720. disp_bed_temp();
  721. disp_fan_speed();
  722. disp_print_time();
  723. disp_fan_Zpos();
  724. }
  725. if (printing_rate_update_flag || marlin_state == MF_SD_COMPLETE) {
  726. printing_rate_update_flag = false;
  727. if (!gcode_preview_over) setProBarRate();
  728. }
  729. break;
  730. case OPERATE_UI:
  731. break;
  732. case PAUSE_UI:
  733. break;
  734. case FAN_UI:
  735. if (temps_update_flag) {
  736. temps_update_flag = false;
  737. disp_fan_value();
  738. }
  739. break;
  740. case MOVE_MOTOR_UI:
  741. break;
  742. #if ENABLED(MKS_WIFI_MODULE)
  743. case WIFI_UI:
  744. if (temps_update_flag) {
  745. disp_wifi_state();
  746. temps_update_flag = false;
  747. }
  748. break;
  749. case BIND_UI:
  750. refresh_bind_ui();
  751. break;
  752. #endif
  753. case FILAMENTCHANGE_UI:
  754. if (temps_update_flag) {
  755. temps_update_flag = false;
  756. disp_filament_temp();
  757. }
  758. break;
  759. case DIALOG_UI:
  760. filament_dialog_handle();
  761. TERN_(MKS_WIFI_MODULE, wifi_scan_handle());
  762. break;
  763. case MESHLEVELING_UI:
  764. break;
  765. case HARDWARE_TEST_UI:
  766. break;
  767. case WIFI_LIST_UI:
  768. #if ENABLED(MKS_WIFI_MODULE)
  769. if (printing_rate_update_flag) {
  770. disp_wifi_list();
  771. printing_rate_update_flag = false;
  772. }
  773. #endif
  774. break;
  775. case KEY_BOARD_UI:
  776. break;
  777. #if ENABLED(MKS_WIFI_MODULE)
  778. case WIFI_TIPS_UI:
  779. switch (wifi_tips_type) {
  780. case TIPS_TYPE_JOINING:
  781. if (wifi_link_state == WIFI_CONNECTED && strcmp((const char *)wifi_list.wifiConnectedName,(const char *)wifi_list.wifiName[wifi_list.nameIndex]) == 0) {
  782. tips_disp.timer = TIPS_TIMER_STOP;
  783. tips_disp.timer_count = 0;
  784. lv_clear_wifi_tips();
  785. wifi_tips_type = TIPS_TYPE_WIFI_CONECTED;
  786. lv_draw_wifi_tips();
  787. }
  788. if (tips_disp.timer_count >= SEC_TO_MS(30)) {
  789. tips_disp.timer = TIPS_TIMER_STOP;
  790. tips_disp.timer_count = 0;
  791. lv_clear_wifi_tips();
  792. wifi_tips_type = TIPS_TYPE_TAILED_JOIN;
  793. lv_draw_wifi_tips();
  794. }
  795. break;
  796. case TIPS_TYPE_TAILED_JOIN:
  797. if (tips_disp.timer_count >= SEC_TO_MS(3)) {
  798. tips_disp.timer = TIPS_TIMER_STOP;
  799. tips_disp.timer_count = 0;
  800. last_disp_state = WIFI_TIPS_UI;
  801. lv_clear_wifi_tips();
  802. lv_draw_wifi_list();
  803. }
  804. break;
  805. case TIPS_TYPE_WIFI_CONECTED:
  806. if (tips_disp.timer_count >= SEC_TO_MS(3)) {
  807. tips_disp.timer = TIPS_TIMER_STOP;
  808. tips_disp.timer_count = 0;
  809. last_disp_state = WIFI_TIPS_UI;
  810. lv_clear_wifi_tips();
  811. lv_draw_wifi();
  812. }
  813. break;
  814. default: break;
  815. }
  816. break;
  817. #endif
  818. case BABY_STEP_UI:
  819. if (temps_update_flag) {
  820. temps_update_flag = false;
  821. disp_z_offset_value();
  822. }
  823. break;
  824. default: break;
  825. }
  826. print_time_run();
  827. }
  828. void clear_cur_ui() {
  829. last_disp_state = disp_state_stack._disp_state[disp_state_stack._disp_index];
  830. switch (disp_state_stack._disp_state[disp_state_stack._disp_index]) {
  831. case PRINT_READY_UI: lv_clear_ready_print(); break;
  832. case PRINT_FILE_UI: lv_clear_print_file(); break;
  833. case PRINTING_UI: lv_clear_printing(); break;
  834. case MOVE_MOTOR_UI: lv_clear_move_motor(); break;
  835. case OPERATE_UI: lv_clear_operation(); break;
  836. case PAUSE_UI: break;
  837. case EXTRUSION_UI: lv_clear_extrusion(); break;
  838. case PRE_HEAT_UI: lv_clear_preHeat(); break;
  839. case CHANGE_SPEED_UI: lv_clear_change_speed(); break;
  840. case FAN_UI: lv_clear_fan(); break;
  841. case SET_UI: lv_clear_set(); break;
  842. case ZERO_UI: lv_clear_home(); break;
  843. case SPRAYER_UI: break;
  844. case MACHINE_UI: break;
  845. case LANGUAGE_UI: lv_clear_language(); break;
  846. case ABOUT_UI: lv_clear_about(); break;
  847. case LOG_UI: break;
  848. case DISK_UI: break;
  849. #if ENABLED(MKS_WIFI_MODULE)
  850. case WIFI_UI: lv_clear_wifi(); break;
  851. #endif
  852. case MORE_UI: lv_clear_more(); break;
  853. case FILETRANSFER_UI: break;
  854. case DIALOG_UI: lv_clear_dialog(); break;
  855. case FILETRANSFERSTATE_UI: break;
  856. case PRINT_MORE_UI: break;
  857. case FILAMENTCHANGE_UI: lv_clear_filament_change(); break;
  858. case LEVELING_UI: lv_clear_manualLevel(); break;
  859. #if ENABLED(MKS_WIFI_MODULE)
  860. case BIND_UI: lv_clear_cloud_bind(); break;
  861. #endif
  862. #if HAS_BED_PROBE
  863. case NOZZLE_PROBE_OFFSET_UI: lv_clear_auto_level_offset_settings(); break;
  864. #endif
  865. case TOOL_UI: lv_clear_tool(); break;
  866. case MESHLEVELING_UI: break;
  867. case HARDWARE_TEST_UI: break;
  868. #if ENABLED(MKS_WIFI_MODULE)
  869. case WIFI_LIST_UI: lv_clear_wifi_list(); break;
  870. #endif
  871. case KEY_BOARD_UI: lv_clear_keyboard(); break;
  872. #if ENABLED(MKS_WIFI_MODULE)
  873. case WIFI_TIPS_UI: lv_clear_wifi_tips(); break;
  874. #endif
  875. case MACHINE_PARA_UI: lv_clear_machine_para(); break;
  876. case MACHINE_SETTINGS_UI: lv_clear_machine_settings(); break;
  877. case TEMPERATURE_SETTINGS_UI: break;
  878. case MOTOR_SETTINGS_UI: lv_clear_motor_settings(); break;
  879. case MACHINETYPE_UI: break;
  880. case STROKE_UI: break;
  881. case HOME_DIR_UI: break;
  882. case ENDSTOP_TYPE_UI: break;
  883. case FILAMENT_SETTINGS_UI: break;
  884. case LEVELING_SETTIGNS_UI: break;
  885. case LEVELING_PARA_UI: lv_clear_level_settings(); break;
  886. case DELTA_LEVELING_PARA_UI: break;
  887. case MANUAL_LEVELING_POSIGION_UI: lv_clear_manual_level_pos_settings(); break;
  888. case MAXFEEDRATE_UI: lv_clear_max_feedrate_settings(); break;
  889. case STEPS_UI: lv_clear_step_settings(); break;
  890. case ACCELERATION_UI: lv_clear_acceleration_settings(); break;
  891. case JERK_UI: TERN_(HAS_CLASSIC_JERK, lv_clear_jerk_settings()); break;
  892. case MOTORDIR_UI: break;
  893. case HOMESPEED_UI: break;
  894. case NOZZLE_CONFIG_UI: break;
  895. case HOTBED_CONFIG_UI: break;
  896. case ADVANCED_UI: lv_clear_advance_settings(); break;
  897. case DOUBLE_Z_UI: break;
  898. case ENABLE_INVERT_UI: break;
  899. case NUMBER_KEY_UI: lv_clear_number_key(); break;
  900. case BABY_STEP_UI: lv_clear_baby_stepping(); break;
  901. case PAUSE_POS_UI: lv_clear_pause_position(); break;
  902. #if HAS_TRINAMIC_CONFIG
  903. case TMC_CURRENT_UI: lv_clear_tmc_current_settings(); break;
  904. #endif
  905. case EEPROM_SETTINGS_UI: lv_clear_eeprom_settings(); break;
  906. #if HAS_STEALTHCHOP
  907. case TMC_MODE_UI: lv_clear_tmc_step_mode_settings(); break;
  908. #endif
  909. #if ENABLED(MKS_WIFI_MODULE)
  910. case WIFI_SETTINGS_UI: lv_clear_wifi_settings(); break;
  911. #endif
  912. #if USE_SENSORLESS
  913. case HOMING_SENSITIVITY_UI: lv_clear_homing_sensitivity_settings(); break;
  914. #endif
  915. #if HAS_ROTARY_ENCODER
  916. case ENCODER_SETTINGS_UI: lv_clear_encoder_settings(); break;
  917. #endif
  918. #if ENABLED(TOUCH_SCREEN_CALIBRATION)
  919. case TOUCH_CALIBRATION_UI: lv_clear_touch_calibration_screen(); break;
  920. #endif
  921. default: break;
  922. }
  923. }
  924. void draw_return_ui() {
  925. if (disp_state_stack._disp_index > 0) {
  926. disp_state_stack._disp_index--;
  927. switch (disp_state_stack._disp_state[disp_state_stack._disp_index]) {
  928. case PRINT_READY_UI: lv_draw_ready_print(); break;
  929. case PRINT_FILE_UI: lv_draw_print_file(); break;
  930. case PRINTING_UI: if (gCfgItems.from_flash_pic)
  931. flash_preview_begin = true;
  932. else
  933. default_preview_flg = true;
  934. lv_draw_printing();
  935. break;
  936. case MOVE_MOTOR_UI: lv_draw_move_motor(); break;
  937. case OPERATE_UI: lv_draw_operation(); break;
  938. case PAUSE_UI: break;
  939. case EXTRUSION_UI: lv_draw_extrusion(); break;
  940. case PRE_HEAT_UI: lv_draw_preHeat(); break;
  941. case CHANGE_SPEED_UI: lv_draw_change_speed(); break;
  942. case FAN_UI: lv_draw_fan(); break;
  943. case SET_UI: lv_draw_set(); break;
  944. case ZERO_UI: lv_draw_home(); break;
  945. case SPRAYER_UI: break;
  946. case MACHINE_UI: break;
  947. case LANGUAGE_UI: lv_draw_language(); break;
  948. case ABOUT_UI: lv_draw_about(); break;
  949. case CALIBRATE_UI: break;
  950. case DISK_UI: break;
  951. #if ENABLED(MKS_WIFI_MODULE)
  952. case WIFI_UI: lv_draw_wifi(); break;
  953. #endif
  954. case MORE_UI: break;
  955. case PRINT_MORE_UI: lv_draw_more(); break;
  956. case FILAMENTCHANGE_UI: lv_draw_filament_change(); break;
  957. case LEVELING_UI: lv_draw_manualLevel(); break;
  958. #if ENABLED(MKS_WIFI_MODULE)
  959. case BIND_UI: lv_draw_cloud_bind(); break;
  960. #endif
  961. #if HAS_BED_PROBE
  962. case NOZZLE_PROBE_OFFSET_UI: lv_draw_auto_level_offset_settings(); break;
  963. #endif
  964. case TOOL_UI: lv_draw_tool(); break;
  965. case GCODE_UI: lv_draw_gcode(); break;
  966. case MESHLEVELING_UI: break;
  967. case HARDWARE_TEST_UI: break;
  968. #if ENABLED(MKS_WIFI_MODULE)
  969. case WIFI_LIST_UI: lv_draw_wifi_list(); break;
  970. #endif
  971. case KEY_BOARD_UI: lv_draw_keyboard(); break;
  972. #if ENABLED(MKS_WIFI_MODULE)
  973. case WIFI_TIPS_UI: lv_draw_wifi_tips(); break;
  974. #endif
  975. case MACHINE_PARA_UI: lv_draw_machine_para(); break;
  976. case MACHINE_SETTINGS_UI: lv_draw_machine_settings(); break;
  977. case TEMPERATURE_SETTINGS_UI: break;
  978. case MOTOR_SETTINGS_UI: lv_draw_motor_settings(); break;
  979. case MACHINETYPE_UI: break;
  980. case STROKE_UI: break;
  981. case HOME_DIR_UI: break;
  982. case ENDSTOP_TYPE_UI: break;
  983. case FILAMENT_SETTINGS_UI: lv_draw_filament_settings(); break;
  984. case LEVELING_SETTIGNS_UI: break;
  985. case LEVELING_PARA_UI: lv_draw_level_settings(); break;
  986. case DELTA_LEVELING_PARA_UI: break;
  987. case MANUAL_LEVELING_POSIGION_UI: lv_draw_manual_level_pos_settings(); break;
  988. case MAXFEEDRATE_UI: lv_draw_max_feedrate_settings(); break;
  989. case STEPS_UI: lv_draw_step_settings(); break;
  990. case ACCELERATION_UI: lv_draw_acceleration_settings(); break;
  991. #if HAS_CLASSIC_JERK
  992. case JERK_UI: lv_draw_jerk_settings(); break;
  993. #endif
  994. case MOTORDIR_UI: break;
  995. case HOMESPEED_UI: break;
  996. case NOZZLE_CONFIG_UI: break;
  997. case HOTBED_CONFIG_UI: break;
  998. case ADVANCED_UI: lv_draw_advance_settings(); break;
  999. case DOUBLE_Z_UI: break;
  1000. case ENABLE_INVERT_UI: break;
  1001. case NUMBER_KEY_UI: lv_draw_number_key(); break;
  1002. case DIALOG_UI: break;
  1003. case BABY_STEP_UI: lv_draw_baby_stepping(); break;
  1004. case PAUSE_POS_UI: lv_draw_pause_position(); break;
  1005. #if HAS_TRINAMIC_CONFIG
  1006. case TMC_CURRENT_UI: lv_draw_tmc_current_settings(); break;
  1007. #endif
  1008. case EEPROM_SETTINGS_UI: lv_draw_eeprom_settings(); break;
  1009. #if HAS_STEALTHCHOP
  1010. case TMC_MODE_UI: lv_draw_tmc_step_mode_settings(); break;
  1011. #endif
  1012. #if ENABLED(MKS_WIFI_MODULE)
  1013. case WIFI_SETTINGS_UI: lv_draw_wifi_settings(); break;
  1014. #endif
  1015. #if USE_SENSORLESS
  1016. case HOMING_SENSITIVITY_UI: lv_draw_homing_sensitivity_settings(); break;
  1017. #endif
  1018. #if HAS_ROTARY_ENCODER
  1019. case ENCODER_SETTINGS_UI: lv_draw_encoder_settings(); break;
  1020. #endif
  1021. default: break;
  1022. }
  1023. }
  1024. }
  1025. // Set the same image for both Released and Pressed
  1026. void lv_imgbtn_set_src_both(lv_obj_t *imgbtn, const void *src) {
  1027. lv_imgbtn_set_src(imgbtn, LV_BTN_STATE_REL, src);
  1028. lv_imgbtn_set_src(imgbtn, LV_BTN_STATE_PR, src);
  1029. }
  1030. // Use label style for the image button
  1031. void lv_imgbtn_use_label_style(lv_obj_t *imgbtn) {
  1032. lv_imgbtn_set_style(imgbtn, LV_BTN_STATE_REL, &tft_style_label_rel);
  1033. lv_imgbtn_set_style(imgbtn, LV_BTN_STATE_PR, &tft_style_label_pre);
  1034. }
  1035. // Use label style for the button
  1036. void lv_btn_use_label_style(lv_obj_t *btn) {
  1037. lv_btn_set_style(btn, LV_BTN_STYLE_REL, &tft_style_label_rel);
  1038. lv_btn_set_style(btn, LV_BTN_STYLE_PR, &tft_style_label_pre);
  1039. }
  1040. // Use button style for the button
  1041. void lv_btn_use_button_style(lv_obj_t *btn) {
  1042. lv_btn_set_style(btn, LV_BTN_STYLE_REL, &style_btn_rel);
  1043. lv_btn_set_style(btn, LV_BTN_STYLE_PR, &style_btn_pr);
  1044. }
  1045. // Use a single style for both Released and Pressed
  1046. void lv_btn_set_style_both(lv_obj_t *btn, lv_style_t *style) {
  1047. lv_btn_set_style(btn, LV_BTN_STYLE_REL, style);
  1048. lv_btn_set_style(btn, LV_BTN_STYLE_PR, style);
  1049. }
  1050. // Create a screen
  1051. lv_obj_t* lv_screen_create(DISP_STATE newScreenType, const char* title) {
  1052. lv_obj_t *scr = lv_obj_create(nullptr, nullptr);
  1053. lv_obj_set_style(scr, &tft_style_scr);
  1054. lv_scr_load(scr);
  1055. lv_obj_clean(scr);
  1056. // breadcrumbs
  1057. if (disp_state_stack._disp_state[disp_state_stack._disp_index] != newScreenType) {
  1058. disp_state_stack._disp_index++;
  1059. disp_state_stack._disp_state[disp_state_stack._disp_index] = newScreenType;
  1060. }
  1061. disp_state = newScreenType;
  1062. // title
  1063. lv_obj_t *titleLabel = nullptr;
  1064. if (!title)
  1065. titleLabel = lv_label_create(scr, TITLE_XPOS, TITLE_YPOS, creat_title_text());
  1066. else if (title[0] != '\0')
  1067. titleLabel = lv_label_create(scr, TITLE_XPOS, TITLE_YPOS, title);
  1068. if (titleLabel)
  1069. lv_obj_set_style(titleLabel, &tft_style_label_rel);
  1070. lv_refr_now(lv_refr_get_disp_refreshing());
  1071. return scr;
  1072. }
  1073. // Create an empty label
  1074. lv_obj_t* lv_label_create_empty(lv_obj_t *par) {
  1075. lv_obj_t *label = lv_label_create(par, (lv_obj_t*)nullptr);
  1076. return label;
  1077. }
  1078. // Create a label with style and text
  1079. lv_obj_t* lv_label_create(lv_obj_t *par, const char *text) {
  1080. lv_obj_t *label = lv_label_create_empty(par);
  1081. if (text) lv_label_set_text(label, text);
  1082. lv_obj_set_style(label, &tft_style_label_rel);
  1083. return label;
  1084. }
  1085. // Create a label with style, position, and text
  1086. lv_obj_t* lv_label_create(lv_obj_t *par, lv_coord_t x, lv_coord_t y, const char *text) {
  1087. lv_obj_t *label = lv_label_create(par, text);
  1088. lv_obj_set_pos(label, x, y);
  1089. return label;
  1090. }
  1091. // Create a button with callback, ID, and Style.
  1092. lv_obj_t* lv_btn_create(lv_obj_t *par, lv_event_cb_t cb, const int id/*=0*/, lv_style_t *style/*=&style_para_value*/) {
  1093. lv_obj_t *btn = lv_btn_create(par, nullptr);
  1094. if (id)
  1095. lv_obj_set_event_cb_mks(btn, cb, id, "", 0);
  1096. else
  1097. lv_obj_set_event_cb(btn, cb);
  1098. lv_btn_set_style_both(btn, style);
  1099. return btn;
  1100. }
  1101. // Create a button with callback and ID, with label style.
  1102. lv_obj_t* lv_label_btn_create(lv_obj_t *par, lv_event_cb_t cb, const int id/*=0*/) {
  1103. lv_obj_t *btn = lv_btn_create(par, cb, id, nullptr);
  1104. lv_btn_use_label_style(btn);
  1105. return btn;
  1106. }
  1107. // Create a button with callback and ID, with button style.
  1108. lv_obj_t* lv_button_btn_create(lv_obj_t *par, lv_event_cb_t cb, const int id/*=0*/) {
  1109. lv_obj_t *btn = lv_btn_create(par, cb, id, nullptr);
  1110. lv_btn_use_button_style(btn);
  1111. return btn;
  1112. }
  1113. // Create a button with position, size, callback, ID, and style.
  1114. lv_obj_t* lv_btn_create(lv_obj_t *par, lv_coord_t x, lv_coord_t y, lv_coord_t w, lv_coord_t h, lv_event_cb_t cb, const int id, lv_style_t *style) {
  1115. lv_obj_t *btn = lv_btn_create(par, cb, id, style);
  1116. lv_obj_set_pos(btn, x, y);
  1117. lv_obj_set_size(btn, w, h);
  1118. return btn;
  1119. }
  1120. // Create a button with position, size, callback, and ID. Style set to style_para_value.
  1121. lv_obj_t* lv_btn_create(lv_obj_t *par, lv_coord_t x, lv_coord_t y, lv_coord_t w, lv_coord_t h, lv_event_cb_t cb, const int id/*=0*/) {
  1122. lv_obj_t *btn = lv_btn_create(par, x, y, w, h, cb, id, &style_para_value);
  1123. return btn;
  1124. }
  1125. // Create a button with position, size, callback, and ID, with label style.
  1126. lv_obj_t* lv_label_btn_create(lv_obj_t *par, lv_coord_t x, lv_coord_t y, lv_coord_t w, lv_coord_t h, lv_event_cb_t cb, const int id/*=0*/) {
  1127. lv_obj_t *btn = lv_label_btn_create(par, cb, id);
  1128. lv_obj_set_pos(btn, x, y);
  1129. lv_obj_set_size(btn, w, h);
  1130. return btn;
  1131. }
  1132. // Create a button with position, size, callback, and ID, with label style.
  1133. lv_obj_t* lv_button_btn_create(lv_obj_t *par, lv_coord_t x, lv_coord_t y, lv_coord_t w, lv_coord_t h, lv_event_cb_t cb, const int id/*=0*/) {
  1134. lv_obj_t *btn = lv_button_btn_create(par, cb, id);
  1135. lv_obj_set_pos(btn, x, y);
  1136. lv_obj_set_size(btn, w, h);
  1137. return btn;
  1138. }
  1139. // Create a button with callback and ID. Style set to style_para_back.
  1140. lv_obj_t* lv_btn_create_back(lv_obj_t *par, lv_event_cb_t cb, const int id/*=0*/) {
  1141. return lv_btn_create(par, cb, id, &style_para_back);
  1142. }
  1143. // Create a button with position, size, callback, and ID. Style set to style_para_back.
  1144. lv_obj_t* lv_btn_create_back(lv_obj_t *par, lv_coord_t x, lv_coord_t y, lv_coord_t w, lv_coord_t h, lv_event_cb_t cb, const int id/*=0*/) {
  1145. lv_obj_t *btn = lv_btn_create_back(par, cb, id);
  1146. lv_obj_set_pos(btn, x, y);
  1147. lv_obj_set_size(btn, w, h);
  1148. return btn;
  1149. }
  1150. // Create an image button with image, callback, and ID. Use label style.
  1151. lv_obj_t* lv_imgbtn_create(lv_obj_t *par, const char *img, lv_event_cb_t cb, const int id/*=0*/) {
  1152. lv_obj_t *btn = lv_imgbtn_create(par, nullptr);
  1153. if (img) lv_imgbtn_set_src_both(btn, img);
  1154. if (id)
  1155. lv_obj_set_event_cb_mks(btn, cb, id, "", 0);
  1156. else
  1157. lv_obj_set_event_cb(btn, cb);
  1158. lv_imgbtn_use_label_style(btn);
  1159. lv_btn_set_layout(btn, LV_LAYOUT_OFF);
  1160. return btn;
  1161. }
  1162. // Create an image button with image, position, callback, and ID. Use label style.
  1163. lv_obj_t* lv_imgbtn_create(lv_obj_t *par, const char *img, lv_coord_t x, lv_coord_t y, lv_event_cb_t cb, const int id/*=0*/) {
  1164. lv_obj_t *btn = lv_imgbtn_create(par, img, cb, id);
  1165. lv_obj_set_pos(btn, x, y);
  1166. return btn;
  1167. }
  1168. lv_obj_t* lv_big_button_create(lv_obj_t *par, const char *img, const char *text, lv_coord_t x, lv_coord_t y, lv_event_cb_t cb, const int id, bool centerLabel) {
  1169. lv_obj_t *btn = lv_imgbtn_create(par, img, cb, id);
  1170. lv_obj_set_pos(btn, x, y);
  1171. lv_obj_t *label = lv_label_create_empty(btn);
  1172. if (gCfgItems.multiple_language) {
  1173. lv_label_set_text(label, text);
  1174. if (centerLabel)
  1175. lv_obj_align(label, btn, LV_ALIGN_CENTER, 0, 0);
  1176. else
  1177. lv_obj_align(label, btn, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET);
  1178. }
  1179. if (TERN0(HAS_ROTARY_ENCODER, gCfgItems.encoder_enable))
  1180. lv_group_add_obj(g, btn);
  1181. return btn;
  1182. }
  1183. lv_obj_t* lv_screen_menu_item(lv_obj_t *par, const char *text, lv_coord_t x, lv_coord_t y, lv_event_cb_t cb, const int id, const int index, bool drawArrow) {
  1184. lv_obj_t *btn = lv_btn_create(par, nullptr); /*Add a button the current screen*/
  1185. lv_obj_set_pos(btn, x, y); /*Set its position*/
  1186. lv_obj_set_size(btn, PARA_UI_SIZE_X, PARA_UI_SIZE_Y); /*Set its size*/
  1187. if (id > -1) lv_obj_set_event_cb_mks(btn, cb, id, "", 0);
  1188. lv_btn_use_label_style(btn);
  1189. lv_btn_set_layout(btn, LV_LAYOUT_OFF);
  1190. lv_obj_t *label = lv_label_create_empty(btn); /*Add a label to the button*/
  1191. if (gCfgItems.multiple_language) {
  1192. lv_label_set_text(label, text);
  1193. lv_obj_align(label, btn, LV_ALIGN_IN_LEFT_MID, 0, 0);
  1194. }
  1195. if (TERN0(HAS_ROTARY_ENCODER, gCfgItems.encoder_enable))
  1196. lv_group_add_obj(g, btn);
  1197. if (drawArrow) (void)lv_imgbtn_create(par, "F:/bmp_arrow.bin", x + PARA_UI_SIZE_X, y + PARA_UI_ARROW_V, cb, id);
  1198. lv_obj_t *line1 = lv_line_create(par, nullptr);
  1199. lv_ex_line(line1, line_points[index]);
  1200. return btn;
  1201. }
  1202. lv_obj_t* lv_screen_menu_item_1_edit(lv_obj_t *par, const char *text, lv_coord_t x, lv_coord_t y, lv_event_cb_t cb, const int id, const int index, const char *editValue) {
  1203. lv_obj_t* btn = lv_screen_menu_item(par, text, x, y, cb, -1, index, false);
  1204. lv_obj_t* btnValue = lv_btn_create(par, PARA_UI_VALUE_POS_X, y + PARA_UI_VALUE_V, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE, cb, id);
  1205. lv_obj_t* labelValue = lv_label_create_empty(btnValue);
  1206. lv_label_set_text(labelValue, editValue);
  1207. lv_obj_align(labelValue, btnValue, LV_ALIGN_CENTER, 0, 0);
  1208. return btn;
  1209. }
  1210. lv_obj_t* lv_screen_menu_item_2_edit(lv_obj_t *par, const char *text, lv_coord_t x, lv_coord_t y, lv_event_cb_t cb, const int id, const int index, const char *editValue, const int idEdit2, const char *editValue2) {
  1211. lv_obj_t* btn = lv_screen_menu_item(par, text, x, y, cb, -1, index, false);
  1212. lv_obj_t* btnValue = lv_btn_create(par, PARA_UI_VALUE_POS_X_2, y + PARA_UI_VALUE_V_2, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE, cb, idEdit2);
  1213. lv_obj_t* labelValue = lv_label_create_empty(btnValue);
  1214. lv_label_set_text(labelValue, editValue2);
  1215. lv_obj_align(labelValue, btnValue, LV_ALIGN_CENTER, 0, 0);
  1216. btnValue = lv_btn_create(par, PARA_UI_VALUE_POS_X, y + PARA_UI_VALUE_V, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE, cb, id);
  1217. labelValue = lv_label_create_empty(btnValue);
  1218. lv_label_set_text(labelValue, editValue);
  1219. lv_obj_align(labelValue, btnValue, LV_ALIGN_CENTER, 0, 0);
  1220. return btn;
  1221. }
  1222. lv_obj_t* lv_screen_menu_item_onoff(lv_obj_t *par, const char *text, lv_coord_t x, lv_coord_t y, lv_event_cb_t cb, const int id, const int index, const bool curValue) {
  1223. lv_screen_menu_item(par, text, x, y, cb, -1, index, false);
  1224. lv_obj_t* btnValue = lv_imgbtn_create(par, curValue ? "F:/bmp_enable.bin" : "F:/bmp_disable.bin", PARA_UI_STATE_POS_X, y + PARA_UI_STATE_V, cb, id);
  1225. lv_obj_t* labelValue = lv_label_create_empty(btnValue);
  1226. lv_label_set_text(labelValue, curValue ? machine_menu.enable : machine_menu.disable);
  1227. lv_obj_align(labelValue, btnValue, LV_ALIGN_CENTER, 0, 0);
  1228. return btnValue;
  1229. }
  1230. void lv_screen_menu_item_onoff_update(lv_obj_t *btn, const bool curValue) {
  1231. lv_imgbtn_set_src_both(btn, curValue ? "F:/bmp_enable.bin" : "F:/bmp_disable.bin");
  1232. lv_label_set_text((lv_obj_t*)btn->child_ll.head, curValue ? machine_menu.enable : machine_menu.disable);
  1233. }
  1234. #if ENABLED(SDSUPPORT)
  1235. void sd_detection() {
  1236. static bool last_sd_status;
  1237. const bool sd_status = IS_SD_INSERTED();
  1238. if (sd_status != last_sd_status) {
  1239. last_sd_status = sd_status;
  1240. if (sd_status) card.mount(); else card.release();
  1241. }
  1242. }
  1243. #endif
  1244. void lv_ex_line(lv_obj_t *line, lv_point_t *points) {
  1245. // Copy the previous line and apply the new style
  1246. lv_line_set_points(line, points, 2); // Set the points
  1247. lv_line_set_style(line, LV_LINE_STYLE_MAIN, &style_line);
  1248. lv_obj_align(line, nullptr, LV_ALIGN_IN_TOP_MID, 0, 0);
  1249. }
  1250. extern volatile uint32_t systick_uptime_millis;
  1251. void print_time_count() {
  1252. if ((systick_uptime_millis % 1000) == 0)
  1253. if (print_time.start == 1) print_time.seconds++;
  1254. }
  1255. void LV_TASK_HANDLER() {
  1256. lv_task_handler();
  1257. if (mks_test_flag == 0x1E) mks_hardware_test();
  1258. TERN_(HAS_GCODE_PREVIEW, disp_pre_gcode(2, 36));
  1259. GUI_RefreshPage();
  1260. TERN_(MKS_WIFI_MODULE, get_wifi_commands());
  1261. #if HAS_ROTARY_ENCODER
  1262. if (gCfgItems.encoder_enable) lv_update_encoder();
  1263. #endif
  1264. }
  1265. #endif // HAS_TFT_LVGL_UI