My Marlin configs for Fabrikator Mini and CTC i3 Pro B
Du kan inte välja fler än 25 ämnen Ämnen måste starta med en bokstav eller siffra, kan innehålla bindestreck ('-') och vara max 35 tecken långa.

draw_ui.cpp 48KB

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