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.

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