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 48KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629
  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. CFG_ITMES gCfgItems;
  42. UI_CFG uiCfg;
  43. DISP_STATE_STACK disp_state_stack;
  44. DISP_STATE disp_state = MAIN_UI;
  45. DISP_STATE last_disp_state;
  46. PRINT_TIME print_time;
  47. num_key_value_state value;
  48. keyboard_value_state keyboard_value;
  49. uint32_t To_pre_view;
  50. bool gcode_preview_over, flash_preview_begin, default_preview_flg;
  51. uint32_t size = 809;
  52. uint16_t row;
  53. uint8_t temperature_change_frequency;
  54. uint8_t printing_rate_update_flag;
  55. extern bool once_flag;
  56. extern uint8_t sel_id;
  57. extern uint8_t public_buf[512];
  58. extern uint8_t bmp_public_buf[17 * 1024];
  59. extern void LCD_IO_WriteData(uint16_t RegValue);
  60. static const char custom_gcode_command[][100] = {
  61. "G28\nG29\nM500",
  62. "G28",
  63. "G28",
  64. "G28",
  65. "G28"
  66. };
  67. lv_point_t line_points[4][2] = {
  68. {{PARA_UI_POS_X, PARA_UI_POS_Y + PARA_UI_SIZE_Y}, {TFT_WIDTH, PARA_UI_POS_Y + PARA_UI_SIZE_Y}},
  69. {{PARA_UI_POS_X, PARA_UI_POS_Y*2 + PARA_UI_SIZE_Y}, {TFT_WIDTH, PARA_UI_POS_Y*2 + PARA_UI_SIZE_Y}},
  70. {{PARA_UI_POS_X, PARA_UI_POS_Y*3 + PARA_UI_SIZE_Y}, {TFT_WIDTH, PARA_UI_POS_Y*3 + PARA_UI_SIZE_Y}},
  71. {{PARA_UI_POS_X, PARA_UI_POS_Y*4 + PARA_UI_SIZE_Y}, {TFT_WIDTH, PARA_UI_POS_Y*4 + PARA_UI_SIZE_Y}}
  72. };
  73. void gCfgItems_init() {
  74. gCfgItems.multiple_language = MULTI_LANGUAGE_ENABLE;
  75. #if 1 // LCD_LANGUAGE == en
  76. gCfgItems.language = LANG_ENGLISH;
  77. #elif LCD_LANGUAGE == zh_CN
  78. gCfgItems.language = LANG_SIMPLE_CHINESE;
  79. #elif LCD_LANGUAGE == zh_TW
  80. gCfgItems.language = LANG_COMPLEX_CHINESE;
  81. #elif LCD_LANGUAGE == jp_kana
  82. gCfgItems.language = LANG_JAPAN;
  83. #elif LCD_LANGUAGE == de
  84. gCfgItems.language = LANG_GERMAN;
  85. #elif LCD_LANGUAGE == fr
  86. gCfgItems.language = LANG_FRENCH;
  87. #elif LCD_LANGUAGE == ru
  88. gCfgItems.language = LANG_RUSSIAN;
  89. #elif LCD_LANGUAGE == ko_KR
  90. gCfgItems.language = LANG_KOREAN;
  91. #elif LCD_LANGUAGE == tr
  92. gCfgItems.language = LANG_TURKISH;
  93. #elif LCD_LANGUAGE == es
  94. gCfgItems.language = LANG_SPANISH;
  95. #elif LCD_LANGUAGE == el
  96. gCfgItems.language = LANG_GREEK;
  97. #elif LCD_LANGUAGE == it
  98. gCfgItems.language = LANG_ITALY;
  99. #elif LCD_LANGUAGE == pt
  100. gCfgItems.language = LANG_PORTUGUESE;
  101. #endif
  102. gCfgItems.leveling_mode = 0;
  103. gCfgItems.from_flash_pic = false;
  104. gCfgItems.curFilesize = 0;
  105. gCfgItems.finish_power_off = false;
  106. gCfgItems.pause_reprint = false;
  107. gCfgItems.pausePosX = -1;
  108. gCfgItems.pausePosY = -1;
  109. gCfgItems.pausePosZ = 5;
  110. gCfgItems.levelingPos[0][0] = X_MIN_POS + 30;
  111. gCfgItems.levelingPos[0][1] = Y_MIN_POS + 30;
  112. gCfgItems.levelingPos[1][0] = X_MAX_POS - 30;
  113. gCfgItems.levelingPos[1][1] = Y_MIN_POS + 30;
  114. gCfgItems.levelingPos[2][0] = X_MAX_POS - 30;
  115. gCfgItems.levelingPos[2][1] = Y_MAX_POS - 30;
  116. gCfgItems.levelingPos[3][0] = X_MIN_POS + 30;
  117. gCfgItems.levelingPos[3][1] = Y_MAX_POS - 30;
  118. gCfgItems.levelingPos[4][0] = X_BED_SIZE / 2;
  119. gCfgItems.levelingPos[4][1] = Y_BED_SIZE / 2;
  120. gCfgItems.cloud_enable = true;
  121. #if ENABLED(USE_WIFI_FUNCTION)
  122. gCfgItems.wifi_mode_sel = STA_MODEL;
  123. gCfgItems.fileSysType = FILE_SYS_SD;
  124. gCfgItems.wifi_type = ESP_WIFI;
  125. #endif
  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_temper = 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.curSprayerChoose = 0;
  162. uiCfg.stepHeat = 10;
  163. uiCfg.leveling_first_time = 0;
  164. uiCfg.para_ui_page = 0;
  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 = 0;
  171. uiCfg.dialogType = 0;
  172. uiCfg.filament_heat_completed_load = 0;
  173. uiCfg.filament_rate = 0;
  174. uiCfg.filament_loading_completed = 0;
  175. uiCfg.filament_unloading_completed = 0;
  176. uiCfg.filament_loading_time_flg = 0;
  177. uiCfg.filament_loading_time_cnt = 0;
  178. uiCfg.filament_unloading_time_flg = 0;
  179. uiCfg.filament_unloading_time_cnt = 0;
  180. #if ENABLED(USE_WIFI_FUNCTION)
  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.0 / gCfgItems.filamentchange_load_speed) + 0.5);
  203. uiCfg.filament_unloading_time = (uint32_t)((gCfgItems.filamentchange_unload_length * 60.0 / gCfgItems.filamentchange_unload_speed) + 0.5);
  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. void tft_style_init() {
  249. lv_style_copy(&tft_style_scr, &lv_style_scr);
  250. tft_style_scr.body.main_color = LV_COLOR_BACKGROUND;
  251. tft_style_scr.body.grad_color = LV_COLOR_BACKGROUND;
  252. tft_style_scr.text.color = LV_COLOR_TEXT;
  253. tft_style_scr.text.sel_color = LV_COLOR_TEXT;
  254. tft_style_scr.line.width = 0;
  255. tft_style_scr.text.letter_space = 0;
  256. tft_style_scr.text.line_space = 0;
  257. lv_style_copy(&tft_style_label_pre, &lv_style_scr);
  258. lv_style_copy(&tft_style_label_rel, &lv_style_scr);
  259. tft_style_label_pre.body.main_color = LV_COLOR_BACKGROUND;
  260. tft_style_label_pre.body.grad_color = LV_COLOR_BACKGROUND;
  261. tft_style_label_pre.text.color = LV_COLOR_TEXT;
  262. tft_style_label_pre.text.sel_color = LV_COLOR_TEXT;
  263. tft_style_label_rel.body.main_color = LV_COLOR_BACKGROUND;
  264. tft_style_label_rel.body.grad_color = LV_COLOR_BACKGROUND;
  265. tft_style_label_rel.text.color = LV_COLOR_TEXT;
  266. tft_style_label_rel.text.sel_color = LV_COLOR_TEXT;
  267. tft_style_label_pre.text.font = TERN(HAS_SPI_FLASH_FONT, &gb2312_puhui32, LV_FONT_DEFAULT);
  268. tft_style_label_rel.text.font = TERN(HAS_SPI_FLASH_FONT, &gb2312_puhui32, LV_FONT_DEFAULT);
  269. tft_style_label_pre.line.width = 0;
  270. tft_style_label_rel.line.width = 0;
  271. tft_style_label_pre.text.letter_space = 0;
  272. tft_style_label_rel.text.letter_space = 0;
  273. tft_style_label_pre.text.line_space = -5;
  274. tft_style_label_rel.text.line_space = -5;
  275. lv_style_copy(&style_para_value_pre, &lv_style_scr);
  276. lv_style_copy(&style_para_value_rel, &lv_style_scr);
  277. style_para_value_pre.body.main_color = LV_COLOR_BACKGROUND;
  278. style_para_value_pre.body.grad_color = LV_COLOR_BACKGROUND;
  279. style_para_value_pre.text.color = LV_COLOR_TEXT;
  280. style_para_value_pre.text.sel_color = LV_COLOR_TEXT;
  281. style_para_value_rel.body.main_color = LV_COLOR_BACKGROUND;
  282. style_para_value_rel.body.grad_color = LV_COLOR_BACKGROUND;
  283. style_para_value_rel.text.color = LV_COLOR_BLACK;
  284. style_para_value_rel.text.sel_color = LV_COLOR_BLACK;
  285. style_para_value_pre.text.font = TERN(HAS_SPI_FLASH_FONT, &gb2312_puhui32, LV_FONT_DEFAULT);
  286. style_para_value_rel.text.font = TERN(HAS_SPI_FLASH_FONT, &gb2312_puhui32, LV_FONT_DEFAULT);
  287. style_para_value_pre.line.width = 0;
  288. style_para_value_rel.line.width = 0;
  289. style_para_value_pre.text.letter_space = 0;
  290. style_para_value_rel.text.letter_space = 0;
  291. style_para_value_pre.text.line_space = -5;
  292. style_para_value_rel.text.line_space = -5;
  293. lv_style_copy(&style_num_key_pre, &lv_style_scr);
  294. lv_style_copy(&style_num_key_rel, &lv_style_scr);
  295. style_num_key_pre.body.main_color = LV_COLOR_KEY_BACKGROUND;
  296. style_num_key_pre.body.grad_color = LV_COLOR_KEY_BACKGROUND;
  297. style_num_key_pre.text.color = LV_COLOR_TEXT;
  298. style_num_key_pre.text.sel_color = LV_COLOR_TEXT;
  299. style_num_key_rel.body.main_color = LV_COLOR_KEY_BACKGROUND;
  300. style_num_key_rel.body.grad_color = LV_COLOR_KEY_BACKGROUND;
  301. style_num_key_rel.text.color = LV_COLOR_TEXT;
  302. style_num_key_rel.text.sel_color = LV_COLOR_TEXT;
  303. #if HAS_SPI_FLASH_FONT
  304. style_num_key_pre.text.font = &gb2312_puhui32;
  305. style_num_key_rel.text.font = &gb2312_puhui32;
  306. #else
  307. style_num_key_pre.text.font = LV_FONT_DEFAULT;
  308. style_num_key_rel.text.font = LV_FONT_DEFAULT;
  309. #endif
  310. style_num_key_pre.line.width = 0;
  311. style_num_key_rel.line.width = 0;
  312. style_num_key_pre.text.letter_space = 0;
  313. style_num_key_rel.text.letter_space = 0;
  314. style_num_key_pre.text.line_space = -5;
  315. style_num_key_rel.text.line_space = -5;
  316. lv_style_copy(&style_num_text, &lv_style_scr);
  317. style_num_text.body.main_color = LV_COLOR_WHITE;
  318. style_num_text.body.grad_color = LV_COLOR_WHITE;
  319. style_num_text.text.color = LV_COLOR_BLACK;
  320. style_num_text.text.sel_color = LV_COLOR_BLACK;
  321. style_num_text.text.font = TERN(HAS_SPI_FLASH_FONT, &gb2312_puhui32, LV_FONT_DEFAULT);
  322. style_num_text.line.width = 0;
  323. style_num_text.text.letter_space = 0;
  324. style_num_text.text.line_space = -5;
  325. lv_style_copy(&style_sel_text, &lv_style_scr);
  326. style_sel_text.body.main_color = LV_COLOR_BACKGROUND;
  327. style_sel_text.body.grad_color = LV_COLOR_BACKGROUND;
  328. style_sel_text.text.color = LV_COLOR_YELLOW;
  329. style_sel_text.text.sel_color = LV_COLOR_YELLOW;
  330. style_sel_text.text.font = &gb2312_puhui32;
  331. style_sel_text.line.width = 0;
  332. style_sel_text.text.letter_space = 0;
  333. style_sel_text.text.line_space = -5;
  334. lv_style_copy(&style_line, &lv_style_plain);
  335. style_line.line.color = LV_COLOR_MAKE(0x49, 0x54, 0xFF);
  336. style_line.line.width = 1;
  337. style_line.line.rounded = 1;
  338. lv_style_copy(&style_para_value, &lv_style_plain);
  339. style_para_value.body.border.color = LV_COLOR_BACKGROUND;
  340. style_para_value.body.border.width = 1;
  341. style_para_value.body.main_color = LV_COLOR_WHITE;
  342. style_para_value.body.grad_color = LV_COLOR_WHITE;
  343. style_para_value.body.shadow.width = 0;
  344. style_para_value.body.radius = 3;
  345. style_para_value.text.color = LV_COLOR_BLACK;
  346. style_para_value.text.font = &TERN(HAS_SPI_FLASH_FONT, gb2312_puhui32, lv_font_roboto_22);
  347. lv_style_copy(&style_para_back, &lv_style_plain);
  348. style_para_back.body.border.color = LV_COLOR_BACKGROUND;
  349. style_para_back.body.border.width = 1;
  350. style_para_back.body.main_color = TFT_LV_PARA_BACK_BODY_COLOR;
  351. style_para_back.body.grad_color = TFT_LV_PARA_BACK_BODY_COLOR;
  352. style_para_back.body.shadow.width = 0;
  353. style_para_back.body.radius = 3;
  354. style_para_back.text.color = LV_COLOR_WHITE;
  355. style_para_back.text.font = &TERN(HAS_SPI_FLASH_FONT, gb2312_puhui32, lv_font_roboto_22);
  356. lv_style_copy(&lv_bar_style_indic, &lv_style_pretty_color);
  357. lv_bar_style_indic.text.color = lv_color_hex3(0xADF);
  358. lv_bar_style_indic.image.color = lv_color_hex3(0xADF);
  359. lv_bar_style_indic.line.color = lv_color_hex3(0xADF);
  360. lv_bar_style_indic.body.main_color = lv_color_hex3(0xADF);
  361. lv_bar_style_indic.body.grad_color = lv_color_hex3(0xADF);
  362. lv_bar_style_indic.body.border.color = lv_color_hex3(0xADF);
  363. }
  364. #define MAX_TITLE_LEN 28
  365. char public_buf_m[100] = {0};
  366. char public_buf_l[30];
  367. void titleText_cat(char *str, int strSize, char *addPart) {
  368. if (str == 0 || addPart == 0) return;
  369. if ((int)(strlen(str) + strlen(addPart)) >= strSize) return;
  370. strcat(str, addPart);
  371. }
  372. char *getDispText(int index) {
  373. ZERO(public_buf_l);
  374. switch (disp_state_stack._disp_state[index]) {
  375. case PRINT_READY_UI:
  376. strcpy(public_buf_l, main_menu.title);
  377. break;
  378. case PRINT_FILE_UI:
  379. strcpy(public_buf_l, file_menu.title);
  380. break;
  381. case PRINTING_UI:
  382. if (disp_state_stack._disp_state[disp_state_stack._disp_index] == PRINTING_UI
  383. #ifndef TFT35
  384. || disp_state_stack._disp_state[disp_state_stack._disp_index] == OPERATE_UI
  385. || disp_state_stack._disp_state[disp_state_stack._disp_index] == PAUSE_UI
  386. #endif
  387. ) strcpy(public_buf_l, common_menu.print_special_title);
  388. else strcpy(public_buf_l, printing_menu.title);
  389. break;
  390. case MOVE_MOTOR_UI:
  391. strcpy(public_buf_l, move_menu.title);
  392. break;
  393. case OPERATE_UI:
  394. if (disp_state_stack._disp_state[disp_state_stack._disp_index] == PRINTING_UI
  395. #ifndef TFT35
  396. || disp_state_stack._disp_state[disp_state_stack._disp_index] == OPERATE_UI
  397. || disp_state_stack._disp_state[disp_state_stack._disp_index] == PAUSE_UI
  398. #endif
  399. ) strcpy(public_buf_l, common_menu.operate_special_title);
  400. else strcpy(public_buf_l, operation_menu.title);
  401. break;
  402. case PAUSE_UI:
  403. if (disp_state_stack._disp_state[disp_state_stack._disp_index] == PRINTING_UI
  404. || disp_state_stack._disp_state[disp_state_stack._disp_index] == OPERATE_UI
  405. || disp_state_stack._disp_state[disp_state_stack._disp_index] == PAUSE_UI
  406. ) strcpy(public_buf_l, common_menu.pause_special_title);
  407. else strcpy(public_buf_l, pause_menu.title);
  408. break;
  409. case EXTRUSION_UI:
  410. strcpy(public_buf_l, extrude_menu.title);
  411. break;
  412. case CHANGE_SPEED_UI:
  413. strcpy(public_buf_l, speed_menu.title);
  414. break;
  415. case FAN_UI:
  416. strcpy(public_buf_l, fan_menu.title);
  417. break;
  418. case PRE_HEAT_UI:
  419. if ((disp_state_stack._disp_state[disp_state_stack._disp_index - 1] == OPERATE_UI))
  420. strcpy(public_buf_l, preheat_menu.adjust_title);
  421. else strcpy(public_buf_l, preheat_menu.title);
  422. break;
  423. case SET_UI:
  424. strcpy(public_buf_l, set_menu.title);
  425. break;
  426. case ZERO_UI:
  427. strcpy(public_buf_l, home_menu.title);
  428. break;
  429. case SPRAYER_UI: break;
  430. case MACHINE_UI: break;
  431. case LANGUAGE_UI:
  432. strcpy(public_buf_l, language_menu.title);
  433. break;
  434. case ABOUT_UI:
  435. strcpy(public_buf_l, about_menu.title);
  436. break;
  437. case LOG_UI: break;
  438. case DISK_UI:
  439. strcpy(public_buf_l, filesys_menu.title);
  440. break;
  441. case DIALOG_UI:
  442. strcpy(public_buf_l, common_menu.dialog_confirm_title);
  443. break;
  444. case WIFI_UI:
  445. strcpy(public_buf_l, wifi_menu.title);
  446. break;
  447. case MORE_UI:
  448. case PRINT_MORE_UI:
  449. strcpy(public_buf_l, more_menu.title);
  450. break;
  451. case FILAMENTCHANGE_UI:
  452. strcpy(public_buf_l, filament_menu.title);
  453. break;
  454. case LEVELING_UI:
  455. case MESHLEVELING_UI:
  456. strcpy(public_buf_l, leveling_menu.title);
  457. break;
  458. case BIND_UI:
  459. strcpy(public_buf_l, cloud_menu.title);
  460. break;
  461. case TOOL_UI:
  462. strcpy(public_buf_l, tool_menu.title);
  463. break;
  464. case WIFI_LIST_UI:
  465. #if ENABLED(USE_WIFI_FUNCTION)
  466. strcpy(public_buf_l, list_menu.title);
  467. break;
  468. #endif
  469. case MACHINE_PARA_UI:
  470. strcpy(public_buf_l, MachinePara_menu.title);
  471. break;
  472. case BABY_STEP_UI:
  473. strcpy(public_buf_l, operation_menu.babystep);
  474. break;
  475. case EEPROM_SETTINGS_UI:
  476. strcpy(public_buf_l, eeprom_menu.title);
  477. break;
  478. default: break;
  479. }
  480. return public_buf_l;
  481. }
  482. char *creat_title_text() {
  483. int index = 0;
  484. char *tmpText = 0;
  485. char tmpCurFileStr[20];
  486. ZERO(tmpCurFileStr);
  487. #if _LFN_UNICODE
  488. //cutFileName((TCHAR *)curFileName, 16, 16, (TCHAR *)tmpCurFileStr);
  489. #else
  490. cutFileName(list_file.long_name[sel_id], 16, 16, tmpCurFileStr);
  491. #endif
  492. ZERO(public_buf_m);
  493. while (index <= disp_state_stack._disp_index) {
  494. tmpText = getDispText(index);
  495. if ((*tmpText == 0) || (tmpText == 0)) {
  496. index++;
  497. continue;
  498. }
  499. titleText_cat(public_buf_m, sizeof(public_buf_m), tmpText);
  500. if (index < disp_state_stack._disp_index) titleText_cat(public_buf_m, sizeof(public_buf_m), (char *)">");
  501. index++;
  502. }
  503. if (disp_state_stack._disp_state[disp_state_stack._disp_index] == PRINTING_UI
  504. /*|| disp_state_stack._disp_state[disp_state_stack._disp_index] == OPERATE_UI
  505. || disp_state_stack._disp_state[disp_state_stack._disp_index] == PAUSE_UI*/
  506. ) {
  507. titleText_cat(public_buf_m, sizeof(public_buf_m), (char *)":");
  508. titleText_cat(public_buf_m, sizeof(public_buf_m), tmpCurFileStr);
  509. }
  510. if (strlen(public_buf_m) > MAX_TITLE_LEN) {
  511. ZERO(public_buf_m);
  512. tmpText = getDispText(0);
  513. if (*tmpText != 0) {
  514. titleText_cat(public_buf_m, sizeof(public_buf_m), tmpText);
  515. titleText_cat(public_buf_m, sizeof(public_buf_m), (char *)">...>");
  516. tmpText = getDispText(disp_state_stack._disp_index);
  517. if (*tmpText != 0) titleText_cat(public_buf_m, sizeof(public_buf_m), tmpText);
  518. }
  519. }
  520. return public_buf_m;
  521. }
  522. #if HAS_GCODE_PREVIEW
  523. uint32_t gPicturePreviewStart = 0;
  524. void preview_gcode_prehandle(char *path) {
  525. #if ENABLED(SDSUPPORT)
  526. //uint8_t re;
  527. //uint32_t read;
  528. uint32_t pre_read_cnt = 0;
  529. uint32_t *p1;
  530. char *cur_name;
  531. gPicturePreviewStart = 0;
  532. cur_name = strrchr(path, '/');
  533. card.openFileRead(cur_name);
  534. card.read(public_buf, 512);
  535. p1 = (uint32_t *)strstr((char *)public_buf, ";simage:");
  536. if (p1) {
  537. pre_read_cnt = (uint32_t)p1 - (uint32_t)((uint32_t *)(&public_buf[0]));
  538. To_pre_view = pre_read_cnt;
  539. gcode_preview_over = true;
  540. gCfgItems.from_flash_pic = true;
  541. update_spi_flash();
  542. }
  543. else {
  544. gcode_preview_over = false;
  545. default_preview_flg = true;
  546. gCfgItems.from_flash_pic = false;
  547. update_spi_flash();
  548. }
  549. card.closefile();
  550. #endif
  551. }
  552. #if 1
  553. void gcode_preview(char *path, int xpos_pixel, int ypos_pixel) {
  554. #if ENABLED(SDSUPPORT)
  555. //uint8_t ress;
  556. //uint32_t write;
  557. volatile uint32_t i, j;
  558. volatile uint16_t *p_index;
  559. //int res;
  560. char *cur_name;
  561. cur_name = strrchr(path, '/');
  562. card.openFileRead(cur_name);
  563. if (gPicturePreviewStart <= 0) {
  564. while (1) {
  565. uint32_t br = card.read(public_buf, 400);
  566. uint32_t* p1 = (uint32_t *)strstr((char *)public_buf, ";gimage:");
  567. if (p1) {
  568. gPicturePreviewStart += (uint32_t)p1 - (uint32_t)((uint32_t *)(&public_buf[0]));
  569. break;
  570. }
  571. else {
  572. gPicturePreviewStart += br;
  573. }
  574. if (br < 400) break;
  575. }
  576. }
  577. card.setIndex((gPicturePreviewStart + To_pre_view) + size * row + 8);
  578. SPI_TFT.setWindow(xpos_pixel, ypos_pixel + row, 200, 1);
  579. j = i = 0;
  580. while (1) {
  581. card.read(public_buf, 400);
  582. for (i = 0; i < 400;) {
  583. bmp_public_buf[j] = ascii2dec_test((char*)&public_buf[i]) << 4 | ascii2dec_test((char*)&public_buf[i + 1]);
  584. i += 2;
  585. j++;
  586. }
  587. if (j >= 400) break;
  588. }
  589. for (i = 0; i < 400; i += 2) {
  590. p_index = (uint16_t *)(&bmp_public_buf[i]);
  591. if (*p_index == 0x0000) *p_index = LV_COLOR_BACKGROUND.full;
  592. }
  593. SPI_TFT.tftio.WriteSequence((uint16_t*)bmp_public_buf, 200);
  594. #if HAS_BAK_VIEW_IN_FLASH
  595. W25QXX.init(SPI_QUARTER_SPEED);
  596. if (row < 20) W25QXX.SPI_FLASH_SectorErase(BAK_VIEW_ADDR_TFT35 + row * 4096);
  597. W25QXX.SPI_FLASH_BufferWrite(bmp_public_buf, BAK_VIEW_ADDR_TFT35 + row * 400, 400);
  598. #endif
  599. row++;
  600. if (row >= 200) {
  601. size = 809;
  602. row = 0;
  603. gcode_preview_over = false;
  604. //flash_preview_begin = true;
  605. card.closefile();
  606. /*
  607. if (gCurFileState.file_open_flag != 0xAA) {
  608. reset_file_info();
  609. res = f_open(file, curFileName, FA_OPEN_EXISTING | FA_READ);
  610. if (res == FR_OK) {
  611. f_lseek(file,PREVIEW_SIZE+To_pre_view);
  612. gCurFileState.file_open_flag = 0xAA;
  613. //bakup_file_path((uint8_t *)curFileName, strlen(curFileName));
  614. srcfp = file;
  615. mksReprint.mks_printer_state = MKS_WORKING;
  616. once_flag = false;
  617. }
  618. }
  619. */
  620. char *cur_name;
  621. cur_name = strrchr(list_file.file_name[sel_id], '/');
  622. SdFile file;
  623. SdFile *curDir;
  624. card.endFilePrint();
  625. const char * const fname = card.diveToFile(true, curDir, cur_name);
  626. if (!fname) return;
  627. if (file.open(curDir, fname, O_READ)) {
  628. gCfgItems.curFilesize = file.fileSize();
  629. file.close();
  630. update_spi_flash();
  631. }
  632. card.openFileRead(cur_name);
  633. if (card.isFileOpen()) {
  634. feedrate_percentage = 100;
  635. //saved_feedrate_percentage = feedrate_percentage;
  636. planner.flow_percentage[0] = 100;
  637. planner.e_factor[0] = planner.flow_percentage[0] * 0.01;
  638. #if HAS_MULTI_EXTRUDER
  639. planner.flow_percentage[1] = 100;
  640. planner.e_factor[1] = planner.flow_percentage[1] * 0.01;
  641. #endif
  642. card.startFileprint();
  643. TERN_(POWER_LOSS_RECOVERY, recovery.prepare());
  644. once_flag = false;
  645. }
  646. return;
  647. }
  648. card.closefile();
  649. #endif // SDSUPPORT
  650. }
  651. #else // if 1
  652. void gcode_preview(char *path, int xpos_pixel, int ypos_pixel) {
  653. #if ENABLED(SDSUPPORT)
  654. //uint8_t ress;
  655. //uint32_t write;
  656. volatile uint32_t i, j;
  657. volatile uint16_t *p_index;
  658. //int res;
  659. char *cur_name;
  660. uint16_t Color;
  661. cur_name = strrchr(path, '/');
  662. card.openFileRead(cur_name);
  663. card.setIndex((PREVIEW_LITTLE_PIC_SIZE + To_pre_view) + size * row + 8);
  664. #if HAS_TFT_LVGL_UI_SPI
  665. SPI_TFT.setWindow(xpos_pixel, ypos_pixel + row, 200, 1);
  666. #else
  667. LCD_setWindowArea(xpos_pixel, ypos_pixel + row, 200, 1);
  668. LCD_WriteRAM_Prepare();
  669. #endif
  670. j = 0;
  671. i = 0;
  672. while (1) {
  673. card.read(public_buf, 400);
  674. for (i = 0; i < 400;) {
  675. bmp_public_buf[j] = ascii2dec_test((char*)&public_buf[i]) << 4 | ascii2dec_test((char*)&public_buf[i + 1]);
  676. i += 2;
  677. j++;
  678. }
  679. //if (i > 800) break;
  680. //#ifdef TFT70
  681. // if (j > 400) {
  682. // f_read(file, buff_pic, 1, &read);
  683. // break;
  684. // }
  685. //#elif defined(TFT35)
  686. if (j >= 400)
  687. //f_read(file, buff_pic, 1, &read);
  688. break;
  689. //#endif
  690. }
  691. #if HAS_TFT_LVGL_UI_SPI
  692. for (i = 0; i < 400;) {
  693. p_index = (uint16_t *)(&bmp_public_buf[i]);
  694. Color = (*p_index >> 8);
  695. *p_index = Color | ((*p_index & 0xFF) << 8);
  696. i += 2;
  697. if (*p_index == 0x0000) *p_index = 0xC318;
  698. }
  699. TFT_CS_L;
  700. TFT_DC_H;
  701. SPI.dmaSend(bmp_public_buf, 400, true);
  702. TFT_CS_H;
  703. #else
  704. for (i = 0; i < 400;) {
  705. p_index = (uint16_t *)(&bmp_public_buf[i]);
  706. if (*p_index == 0x0000) *p_index = 0x18C3;
  707. LCD_IO_WriteData(*p_index);
  708. i = i + 2;
  709. }
  710. #endif
  711. W25QXX.init(SPI_QUARTER_SPEED);
  712. if (row < 20)
  713. W25QXX.SPI_FLASH_SectorErase(BAK_VIEW_ADDR_TFT35 + row * 4096);
  714. W25QXX.SPI_FLASH_BufferWrite(bmp_public_buf, BAK_VIEW_ADDR_TFT35 + row * 400, 400);
  715. row++;
  716. if (row >= 200) {
  717. size = 809;
  718. row = 0;
  719. gcode_preview_over = false;
  720. //flash_preview_begin = true;
  721. card.closefile();
  722. /*
  723. if (gCurFileState.file_open_flag != 0xAA) {
  724. reset_file_info();
  725. res = f_open(file, curFileName, FA_OPEN_EXISTING | FA_READ);
  726. if (res == FR_OK) {
  727. f_lseek(file,PREVIEW_SIZE+To_pre_view);
  728. gCurFileState.file_open_flag = 0xAA;
  729. //bakup_file_path((uint8_t *)curFileName, strlen(curFileName));
  730. srcfp = file;
  731. mksReprint.mks_printer_state = MKS_WORKING;
  732. once_flag = false;
  733. }
  734. }
  735. */
  736. char *cur_name;
  737. cur_name = strrchr(list_file.file_name[sel_id], '/');
  738. SdFile file;
  739. SdFile *curDir;
  740. card.endFilePrint();
  741. const char * const fname = card.diveToFile(true, curDir, cur_name);
  742. if (!fname) return;
  743. if (file.open(curDir, fname, O_READ)) {
  744. gCfgItems.curFilesize = file.fileSize();
  745. file.close();
  746. update_spi_flash();
  747. }
  748. card.openFileRead(cur_name);
  749. if (card.isFileOpen()) {
  750. feedrate_percentage = 100;
  751. //saved_feedrate_percentage = feedrate_percentage;
  752. planner.flow_percentage[0] = 100;
  753. planner.e_factor[0] = planner.flow_percentage[0] * 0.01;
  754. #if HAS_MULTI_EXTRUDER
  755. planner.flow_percentage[1] = 100;
  756. planner.e_factor[1] = planner.flow_percentage[1] * 0.01;
  757. #endif
  758. card.startFileprint();
  759. TERN_(POWER_LOSS_RECOVERY, recovery.prepare());
  760. once_flag = false;
  761. }
  762. return;
  763. }
  764. card.closefile();
  765. #endif // SDSUPPORT
  766. }
  767. #endif // if 1
  768. void Draw_default_preview(int xpos_pixel, int ypos_pixel, uint8_t sel) {
  769. int index;
  770. int y_off = 0;
  771. W25QXX.init(SPI_QUARTER_SPEED);
  772. for (index = 0; index < 10; index++) { // 200*200
  773. #if HAS_BAK_VIEW_IN_FLASH
  774. if (sel == 1) {
  775. flash_view_Read(bmp_public_buf, 8000); // 20k
  776. }
  777. else {
  778. default_view_Read(bmp_public_buf, DEFAULT_VIEW_MAX_SIZE / 10); // 8k
  779. }
  780. #else
  781. default_view_Read(bmp_public_buf, DEFAULT_VIEW_MAX_SIZE / 10); // 8k
  782. #endif
  783. SPI_TFT.setWindow(xpos_pixel, y_off * 20 + ypos_pixel, 200, 20); // 200*200
  784. SPI_TFT.tftio.WriteSequence((uint16_t*)(bmp_public_buf), DEFAULT_VIEW_MAX_SIZE / 20);
  785. y_off++;
  786. }
  787. W25QXX.init(SPI_QUARTER_SPEED);
  788. }
  789. void disp_pre_gcode(int xpos_pixel, int ypos_pixel) {
  790. if (gcode_preview_over) gcode_preview(list_file.file_name[sel_id], xpos_pixel, ypos_pixel);
  791. #if HAS_BAK_VIEW_IN_FLASH
  792. if (flash_preview_begin) {
  793. flash_preview_begin = false;
  794. Draw_default_preview(xpos_pixel, ypos_pixel, 1);
  795. }
  796. #endif
  797. #if HAS_GCODE_DEFAULT_VIEW_IN_FLASH
  798. if (default_preview_flg) {
  799. Draw_default_preview(xpos_pixel, ypos_pixel, 0);
  800. default_preview_flg = false;
  801. }
  802. #endif
  803. }
  804. #endif // HAS_GCODE_PREVIEW
  805. void print_time_run() {
  806. static uint8_t lastSec = 0;
  807. if (print_time.seconds >= 60) {
  808. print_time.seconds = 0;
  809. print_time.minutes++;
  810. if (print_time.minutes >= 60) {
  811. print_time.minutes = 0;
  812. print_time.hours++;
  813. }
  814. }
  815. if (disp_state == PRINTING_UI) {
  816. if (lastSec != print_time.seconds) disp_print_time();
  817. lastSec = print_time.seconds;
  818. }
  819. }
  820. void GUI_RefreshPage() {
  821. if ((systick_uptime_millis % 1000) == 0) temperature_change_frequency = 1;
  822. if ((systick_uptime_millis % 3000) == 0) printing_rate_update_flag = 1;
  823. switch (disp_state) {
  824. case MAIN_UI:
  825. //lv_draw_ready_print();
  826. break;
  827. case EXTRUSION_UI:
  828. if (temperature_change_frequency == 1) {
  829. temperature_change_frequency = 0;
  830. disp_hotend_temp();
  831. }
  832. break;
  833. case PRE_HEAT_UI:
  834. if (temperature_change_frequency == 1) {
  835. temperature_change_frequency = 0;
  836. disp_desire_temp();
  837. }
  838. break;
  839. case PRINT_READY_UI:
  840. /*
  841. if (gCfgItems.display_style == 2) {
  842. if (temperature_change_frequency) {
  843. temperature_change_frequency = 0;
  844. disp_restro_state();
  845. }
  846. }
  847. */
  848. break;
  849. case PRINT_FILE_UI: break;
  850. case PRINTING_UI:
  851. if (temperature_change_frequency) {
  852. temperature_change_frequency = 0;
  853. disp_ext_temp();
  854. disp_bed_temp();
  855. disp_fan_speed();
  856. disp_print_time();
  857. disp_fan_Zpos();
  858. }
  859. if (printing_rate_update_flag || marlin_state == MF_SD_COMPLETE) {
  860. printing_rate_update_flag = 0;
  861. if (!gcode_preview_over) setProBarRate();
  862. }
  863. break;
  864. case OPERATE_UI:
  865. /*
  866. if (temperature_change_frequency == 1) {
  867. temperature_change_frequency = 0;
  868. disp_temp_operate();
  869. }
  870. setProBarRateOpera();
  871. */
  872. break;
  873. case PAUSE_UI:
  874. /*
  875. if (temperature_change_frequency == 1) {
  876. temperature_change_frequency = 0;
  877. disp_temp_pause();
  878. }
  879. */
  880. break;
  881. case FAN_UI:
  882. if (temperature_change_frequency == 1) {
  883. temperature_change_frequency = 0;
  884. disp_fan_value();
  885. }
  886. break;
  887. case MOVE_MOTOR_UI:
  888. /*
  889. if (mksReprint.mks_printer_state == MKS_IDLE) {
  890. if ((z_high_count==1)&&(temper_error_flg != 1)) {
  891. z_high_count = 0;
  892. {
  893. memset((char *)gCfgItems.move_z_coordinate, ' ', sizeof(gCfgItems.move_z_coordinate));
  894. GUI_DispStringAt((const char *)gCfgItems.move_z_coordinate, 380, TITLE_YPOS);
  895. sprintf_P((char *)gCfgItems.move_z_coordinate, PSTR("Z: %.3f"), current_position[Z_AXIS]);
  896. GUI_DispStringAt((const char *)gCfgItems.move_z_coordinate, 380, TITLE_YPOS);
  897. }
  898. }
  899. }
  900. */
  901. break;
  902. #if ENABLED(USE_WIFI_FUNCTION)
  903. case WIFI_UI:
  904. if (temperature_change_frequency == 1) {
  905. disp_wifi_state();
  906. temperature_change_frequency = 0;
  907. }
  908. break;
  909. #endif
  910. case BIND_UI:
  911. /*refresh_bind_ui();*/
  912. break;
  913. case FILAMENTCHANGE_UI:
  914. if (temperature_change_frequency) {
  915. temperature_change_frequency = 0;
  916. disp_filament_temp();
  917. }
  918. break;
  919. case DIALOG_UI:
  920. filament_dialog_handle();
  921. TERN_(USE_WIFI_FUNCTION, wifi_scan_handle());
  922. break;
  923. case MESHLEVELING_UI:
  924. /*disp_zpos();*/
  925. break;
  926. case HARDWARE_TEST_UI:
  927. break;
  928. case WIFI_LIST_UI:
  929. #if ENABLED(USE_WIFI_FUNCTION)
  930. if (printing_rate_update_flag == 1) {
  931. disp_wifi_list();
  932. printing_rate_update_flag = 0;
  933. }
  934. #endif
  935. break;
  936. case KEY_BOARD_UI:
  937. /*update_password_disp();
  938. update_join_state_disp();*/
  939. break;
  940. #if ENABLED(USE_WIFI_FUNCTION)
  941. case WIFI_TIPS_UI:
  942. switch (wifi_tips_type) {
  943. case TIPS_TYPE_JOINING:
  944. if (wifi_link_state == WIFI_CONNECTED && strcmp((const char *)wifi_list.wifiConnectedName,(const char *)wifi_list.wifiName[wifi_list.nameIndex]) == 0) {
  945. tips_disp.timer = TIPS_TIMER_STOP;
  946. tips_disp.timer_count = 0;
  947. lv_clear_wifi_tips();
  948. wifi_tips_type = TIPS_TYPE_WIFI_CONECTED;
  949. lv_draw_wifi_tips();
  950. }
  951. if (tips_disp.timer_count >= 30 * 1000) {
  952. tips_disp.timer = TIPS_TIMER_STOP;
  953. tips_disp.timer_count = 0;
  954. lv_clear_wifi_tips();
  955. wifi_tips_type = TIPS_TYPE_TAILED_JOIN;
  956. lv_draw_wifi_tips();
  957. }
  958. break;
  959. case TIPS_TYPE_TAILED_JOIN:
  960. if (tips_disp.timer_count >= 3 * 1000) {
  961. tips_disp.timer = TIPS_TIMER_STOP;
  962. tips_disp.timer_count = 0;
  963. last_disp_state = WIFI_TIPS_UI;
  964. lv_clear_wifi_tips();
  965. lv_draw_wifi_list();
  966. }
  967. break;
  968. case TIPS_TYPE_WIFI_CONECTED:
  969. if (tips_disp.timer_count >= 3 * 1000) {
  970. tips_disp.timer = TIPS_TIMER_STOP;
  971. tips_disp.timer_count = 0;
  972. last_disp_state = WIFI_TIPS_UI;
  973. lv_clear_wifi_tips();
  974. lv_draw_wifi();
  975. }
  976. break;
  977. default: break;
  978. }
  979. break;
  980. #endif
  981. case BABY_STEP_UI:
  982. if (temperature_change_frequency == 1) {
  983. temperature_change_frequency = 0;
  984. disp_z_offset_value();
  985. }
  986. break;
  987. default: break;
  988. }
  989. print_time_run();
  990. }
  991. void clear_cur_ui() {
  992. last_disp_state = disp_state_stack._disp_state[disp_state_stack._disp_index];
  993. switch (disp_state_stack._disp_state[disp_state_stack._disp_index]) {
  994. case PRINT_READY_UI:
  995. //Get_Temperature_Flg = 0;
  996. lv_clear_ready_print();
  997. break;
  998. case PRINT_FILE_UI:
  999. lv_clear_print_file();
  1000. break;
  1001. case PRINTING_UI:
  1002. lv_clear_printing();
  1003. break;
  1004. case MOVE_MOTOR_UI:
  1005. lv_clear_move_motor();
  1006. break;
  1007. case OPERATE_UI:
  1008. lv_clear_operation();
  1009. break;
  1010. case PAUSE_UI:
  1011. //Clear_pause();
  1012. break;
  1013. case EXTRUSION_UI:
  1014. lv_clear_extrusion();
  1015. break;
  1016. case PRE_HEAT_UI:
  1017. lv_clear_preHeat();
  1018. break;
  1019. case CHANGE_SPEED_UI:
  1020. lv_clear_change_speed();
  1021. break;
  1022. case FAN_UI:
  1023. lv_clear_fan();
  1024. break;
  1025. case SET_UI:
  1026. lv_clear_set();
  1027. break;
  1028. case ZERO_UI:
  1029. lv_clear_home();
  1030. break;
  1031. case SPRAYER_UI:
  1032. //Clear_Sprayer();
  1033. break;
  1034. case MACHINE_UI:
  1035. //Clear_Machine();
  1036. break;
  1037. case LANGUAGE_UI:
  1038. lv_clear_language();
  1039. break;
  1040. case ABOUT_UI:
  1041. lv_clear_about();
  1042. break;
  1043. case LOG_UI:
  1044. //Clear_Connect();
  1045. break;
  1046. case DISK_UI:
  1047. //Clear_Disk();
  1048. break;
  1049. #if ENABLED(USE_WIFI_FUNCTION)
  1050. case WIFI_UI:
  1051. lv_clear_wifi();
  1052. break;
  1053. #endif
  1054. case MORE_UI:
  1055. //Clear_more();
  1056. break;
  1057. case FILETRANSFER_UI:
  1058. //Clear_fileTransfer();
  1059. break;
  1060. case DIALOG_UI:
  1061. lv_clear_dialog();
  1062. break;
  1063. case FILETRANSFERSTATE_UI:
  1064. //Clear_WifiFileTransferdialog();
  1065. break;
  1066. case PRINT_MORE_UI:
  1067. //Clear_Printmore();
  1068. break;
  1069. case FILAMENTCHANGE_UI:
  1070. lv_clear_filament_change();
  1071. break;
  1072. case LEVELING_UI:
  1073. lv_clear_manualLevel();
  1074. break;
  1075. case BIND_UI:
  1076. //Clear_Bind();
  1077. break;
  1078. #if HAS_BED_PROBE
  1079. case NOZZLE_PROBE_OFFSET_UI:
  1080. lv_clear_auto_level_offset_settings();
  1081. break;
  1082. #endif
  1083. case TOOL_UI:
  1084. lv_clear_tool();
  1085. break;
  1086. case MESHLEVELING_UI:
  1087. //Clear_MeshLeveling();
  1088. break;
  1089. case HARDWARE_TEST_UI:
  1090. //Clear_Hardwaretest();
  1091. break;
  1092. #if ENABLED(USE_WIFI_FUNCTION)
  1093. case WIFI_LIST_UI:
  1094. lv_clear_wifi_list();
  1095. break;
  1096. #endif
  1097. case KEY_BOARD_UI:
  1098. lv_clear_keyboard();
  1099. break;
  1100. #if ENABLED(USE_WIFI_FUNCTION)
  1101. case WIFI_TIPS_UI:
  1102. lv_clear_wifi_tips();
  1103. break;
  1104. #endif
  1105. case MACHINE_PARA_UI:
  1106. lv_clear_machine_para();
  1107. break;
  1108. case MACHINE_SETTINGS_UI:
  1109. lv_clear_machine_settings();
  1110. break;
  1111. case TEMPERATURE_SETTINGS_UI:
  1112. //Clear_TemperatureSettings();
  1113. break;
  1114. case MOTOR_SETTINGS_UI:
  1115. lv_clear_motor_settings();
  1116. break;
  1117. case MACHINETYPE_UI:
  1118. //Clear_MachineType();
  1119. break;
  1120. case STROKE_UI:
  1121. //Clear_Stroke();
  1122. break;
  1123. case HOME_DIR_UI:
  1124. //Clear_HomeDir();
  1125. break;
  1126. case ENDSTOP_TYPE_UI:
  1127. //Clear_EndstopType();
  1128. break;
  1129. case FILAMENT_SETTINGS_UI:
  1130. lv_clear_filament_settings();
  1131. break;
  1132. case LEVELING_SETTIGNS_UI:
  1133. //Clear_LevelingSettings();
  1134. break;
  1135. case LEVELING_PARA_UI:
  1136. lv_clear_level_settings();
  1137. break;
  1138. case DELTA_LEVELING_PARA_UI:
  1139. //Clear_DeltaLevelPara();
  1140. break;
  1141. case MANUAL_LEVELING_POSIGION_UI:
  1142. lv_clear_manual_level_pos_settings();
  1143. break;
  1144. case MAXFEEDRATE_UI:
  1145. lv_clear_max_feedrate_settings();
  1146. break;
  1147. case STEPS_UI:
  1148. lv_clear_step_settings();
  1149. break;
  1150. case ACCELERATION_UI:
  1151. lv_clear_acceleration_settings();
  1152. break;
  1153. case JERK_UI:
  1154. #if HAS_CLASSIC_JERK
  1155. lv_clear_jerk_settings();
  1156. #endif
  1157. break;
  1158. case MOTORDIR_UI:
  1159. //Clear_MotorDir();
  1160. break;
  1161. case HOMESPEED_UI:
  1162. //Clear_HomeSpeed();
  1163. break;
  1164. case NOZZLE_CONFIG_UI:
  1165. //Clear_NozzleConfig();
  1166. break;
  1167. case HOTBED_CONFIG_UI:
  1168. //Clear_HotbedConfig();
  1169. break;
  1170. case ADVANCED_UI:
  1171. lv_clear_advance_settings();
  1172. break;
  1173. case DOUBLE_Z_UI:
  1174. //Clear_DoubleZ();
  1175. break;
  1176. case ENABLE_INVERT_UI:
  1177. //Clear_EnableInvert();
  1178. break;
  1179. case NUMBER_KEY_UI:
  1180. lv_clear_number_key();
  1181. break;
  1182. case BABY_STEP_UI:
  1183. lv_clear_baby_stepping();
  1184. break;
  1185. case PAUSE_POS_UI:
  1186. lv_clear_pause_position();
  1187. break;
  1188. #if HAS_TRINAMIC_CONFIG
  1189. case TMC_CURRENT_UI:
  1190. lv_clear_tmc_current_settings();
  1191. break;
  1192. #endif
  1193. case EEPROM_SETTINGS_UI:
  1194. lv_clear_eeprom_settings();
  1195. break;
  1196. #if HAS_STEALTHCHOP
  1197. case TMC_MODE_UI:
  1198. lv_clear_tmc_step_mode_settings();
  1199. break;
  1200. #endif
  1201. #if ENABLED(USE_WIFI_FUNCTION)
  1202. case WIFI_SETTINGS_UI:
  1203. lv_clear_wifi_settings();
  1204. break;
  1205. #endif
  1206. #if USE_SENSORLESS
  1207. case HOMING_SENSITIVITY_UI:
  1208. lv_clear_homing_sensitivity_settings();
  1209. break;
  1210. #endif
  1211. #if HAS_ROTARY_ENCODER
  1212. case ENCODER_SETTINGS_UI:
  1213. lv_clear_encoder_settings();
  1214. break;
  1215. #endif
  1216. default: break;
  1217. }
  1218. //GUI_Clear();
  1219. }
  1220. void draw_return_ui() {
  1221. if (disp_state_stack._disp_index > 0) {
  1222. disp_state_stack._disp_index--;
  1223. switch (disp_state_stack._disp_state[disp_state_stack._disp_index]) {
  1224. case PRINT_READY_UI:
  1225. lv_draw_ready_print();
  1226. break;
  1227. case PRINT_FILE_UI:
  1228. lv_draw_print_file();
  1229. break;
  1230. case PRINTING_UI:
  1231. if (gCfgItems.from_flash_pic) flash_preview_begin = true;
  1232. else default_preview_flg = true;
  1233. lv_draw_printing();
  1234. break;
  1235. case MOVE_MOTOR_UI:
  1236. lv_draw_move_motor();
  1237. break;
  1238. case OPERATE_UI:
  1239. lv_draw_operation();
  1240. break;
  1241. #if 1
  1242. case PAUSE_UI:
  1243. //draw_pause();
  1244. break;
  1245. #endif
  1246. case EXTRUSION_UI:
  1247. lv_draw_extrusion();
  1248. break;
  1249. case PRE_HEAT_UI:
  1250. lv_draw_preHeat();
  1251. break;
  1252. case CHANGE_SPEED_UI:
  1253. lv_draw_change_speed();
  1254. break;
  1255. case FAN_UI:
  1256. lv_draw_fan();
  1257. break;
  1258. case SET_UI:
  1259. lv_draw_set();
  1260. break;
  1261. case ZERO_UI:
  1262. lv_draw_home();
  1263. break;
  1264. case SPRAYER_UI:
  1265. //draw_Sprayer();
  1266. break;
  1267. case MACHINE_UI:
  1268. //draw_Machine();
  1269. break;
  1270. case LANGUAGE_UI:
  1271. lv_draw_language();
  1272. break;
  1273. case ABOUT_UI:
  1274. lv_draw_about();
  1275. break;
  1276. case CALIBRATE_UI:
  1277. //draw_calibrate();
  1278. break;
  1279. case DISK_UI:
  1280. //draw_Disk();
  1281. break;
  1282. #if ENABLED(USE_WIFI_FUNCTION)
  1283. case WIFI_UI:
  1284. lv_draw_wifi();
  1285. break;
  1286. #endif
  1287. case MORE_UI:
  1288. //draw_More();
  1289. break;
  1290. case PRINT_MORE_UI:
  1291. //draw_printmore();
  1292. break;
  1293. case FILAMENTCHANGE_UI:
  1294. lv_draw_filament_change();
  1295. break;
  1296. case LEVELING_UI:
  1297. lv_draw_manualLevel();
  1298. break;
  1299. case BIND_UI:
  1300. //draw_bind();
  1301. break;
  1302. #if HAS_BED_PROBE
  1303. case NOZZLE_PROBE_OFFSET_UI:
  1304. lv_draw_auto_level_offset_settings();
  1305. break;
  1306. #endif
  1307. case TOOL_UI:
  1308. lv_draw_tool();
  1309. break;
  1310. case MESHLEVELING_UI:
  1311. //draw_meshleveling();
  1312. break;
  1313. case HARDWARE_TEST_UI:
  1314. //draw_Hardwaretest();
  1315. break;
  1316. case WIFI_LIST_UI:
  1317. #if ENABLED(USE_WIFI_FUNCTION)
  1318. lv_draw_wifi_list();
  1319. #endif
  1320. break;
  1321. case KEY_BOARD_UI:
  1322. lv_draw_keyboard();
  1323. break;
  1324. case WIFI_TIPS_UI:
  1325. #if ENABLED(USE_WIFI_FUNCTION)
  1326. lv_draw_wifi_tips();
  1327. #endif
  1328. break;
  1329. case MACHINE_PARA_UI:
  1330. lv_draw_machine_para();
  1331. break;
  1332. case MACHINE_SETTINGS_UI:
  1333. lv_draw_machine_settings();
  1334. break;
  1335. case TEMPERATURE_SETTINGS_UI:
  1336. //draw_TemperatureSettings();
  1337. break;
  1338. case MOTOR_SETTINGS_UI:
  1339. lv_draw_motor_settings();
  1340. break;
  1341. case MACHINETYPE_UI:
  1342. //draw_MachineType();
  1343. break;
  1344. case STROKE_UI:
  1345. //draw_Stroke();
  1346. break;
  1347. case HOME_DIR_UI:
  1348. //draw_HomeDir();
  1349. break;
  1350. case ENDSTOP_TYPE_UI:
  1351. //draw_EndstopType();
  1352. break;
  1353. case FILAMENT_SETTINGS_UI:
  1354. lv_draw_filament_settings();
  1355. break;
  1356. case LEVELING_SETTIGNS_UI:
  1357. //draw_LevelingSettings();
  1358. break;
  1359. case LEVELING_PARA_UI:
  1360. lv_draw_level_settings();
  1361. break;
  1362. case DELTA_LEVELING_PARA_UI:
  1363. //draw_DeltaLevelPara();
  1364. break;
  1365. case MANUAL_LEVELING_POSIGION_UI:
  1366. lv_draw_manual_level_pos_settings();
  1367. break;
  1368. case MAXFEEDRATE_UI:
  1369. lv_draw_max_feedrate_settings();
  1370. break;
  1371. case STEPS_UI:
  1372. lv_draw_step_settings();
  1373. break;
  1374. case ACCELERATION_UI:
  1375. lv_draw_acceleration_settings();
  1376. break;
  1377. case JERK_UI:
  1378. #if HAS_CLASSIC_JERK
  1379. lv_draw_jerk_settings();
  1380. #endif
  1381. break;
  1382. case MOTORDIR_UI:
  1383. //draw_MotorDir();
  1384. break;
  1385. case HOMESPEED_UI:
  1386. //draw_HomeSpeed();
  1387. break;
  1388. case NOZZLE_CONFIG_UI:
  1389. //draw_NozzleConfig();
  1390. break;
  1391. case HOTBED_CONFIG_UI:
  1392. //draw_HotbedConfig();
  1393. break;
  1394. case ADVANCED_UI:
  1395. lv_draw_advance_settings();
  1396. break;
  1397. case DOUBLE_Z_UI:
  1398. //draw_DoubleZ();
  1399. break;
  1400. case ENABLE_INVERT_UI:
  1401. //draw_EnableInvert();
  1402. break;
  1403. case NUMBER_KEY_UI:
  1404. lv_draw_number_key();
  1405. break;
  1406. case DIALOG_UI:
  1407. //draw_dialog(uiCfg.dialogType);
  1408. break;
  1409. case BABY_STEP_UI:
  1410. lv_draw_baby_stepping();
  1411. break;
  1412. case PAUSE_POS_UI:
  1413. lv_draw_pause_position();
  1414. break;
  1415. #if HAS_TRINAMIC_CONFIG
  1416. case TMC_CURRENT_UI:
  1417. lv_draw_tmc_current_settings();
  1418. break;
  1419. #endif
  1420. case EEPROM_SETTINGS_UI:
  1421. lv_draw_eeprom_settings();
  1422. break;
  1423. #if HAS_STEALTHCHOP
  1424. case TMC_MODE_UI:
  1425. lv_draw_tmc_step_mode_settings();
  1426. break;
  1427. #endif
  1428. #if ENABLED(USE_WIFI_FUNCTION)
  1429. case WIFI_SETTINGS_UI:
  1430. lv_draw_wifi_settings();
  1431. break;
  1432. #endif
  1433. #if USE_SENSORLESS
  1434. case HOMING_SENSITIVITY_UI:
  1435. lv_draw_homing_sensitivity_settings();
  1436. break;
  1437. #endif
  1438. #if HAS_ROTARY_ENCODER
  1439. case ENCODER_SETTINGS_UI:
  1440. lv_draw_encoder_settings();
  1441. break;
  1442. #endif
  1443. default: break;
  1444. }
  1445. }
  1446. }
  1447. #if ENABLED(SDSUPPORT)
  1448. void sd_detection() {
  1449. static bool last_sd_status;
  1450. const bool sd_status = IS_SD_INSERTED();
  1451. if (sd_status != last_sd_status) {
  1452. last_sd_status = sd_status;
  1453. if (sd_status) card.mount(); else card.release();
  1454. }
  1455. }
  1456. #endif
  1457. void lv_ex_line(lv_obj_t * line, lv_point_t *points) {
  1458. // Copy the previous line and apply the new style
  1459. lv_line_set_points(line, points, 2); // Set the points
  1460. lv_line_set_style(line, LV_LINE_STYLE_MAIN, &style_line);
  1461. lv_obj_align(line, NULL, LV_ALIGN_IN_TOP_MID, 0, 0);
  1462. }
  1463. extern volatile uint32_t systick_uptime_millis;
  1464. void print_time_count() {
  1465. if ((systick_uptime_millis % 1000) == 0)
  1466. if (print_time.start == 1) print_time.seconds++;
  1467. }
  1468. void LV_TASK_HANDLER() {
  1469. //lv_tick_inc(1);
  1470. lv_task_handler();
  1471. if (mks_test_flag == 0x1E) mks_hardware_test();
  1472. #if HAS_GCODE_PREVIEW
  1473. disp_pre_gcode(2, 36);
  1474. #endif
  1475. GUI_RefreshPage();
  1476. #if ENABLED(USE_WIFI_FUNCTION)
  1477. get_wifi_commands();
  1478. #endif
  1479. //sd_detection();
  1480. #if HAS_ROTARY_ENCODER
  1481. if (gCfgItems.encoder_enable) lv_update_encoder();
  1482. #endif
  1483. }
  1484. #endif // HAS_TFT_LVGL_UI