My Marlin configs for Fabrikator Mini and CTC i3 Pro B
您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符

draw_ui.cpp 59KB

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