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

draw_dialog.cpp 28KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703
  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. /**
  23. * draw_dialog.cpp
  24. */
  25. #include "../../../../inc/MarlinConfigPre.h"
  26. #if HAS_TFT_LVGL_UI
  27. #include "lv_conf.h"
  28. #include "draw_ui.h"
  29. //#include "../lvgl/src/lv_objx/lv_imgbtn.h"
  30. //#include "../lvgl/src/lv_objx/lv_img.h"
  31. //#include "../lvgl/src/lv_core/lv_disp.h"
  32. //#include "../lvgl/src/lv_core/lv_refr.h"
  33. #include "../../../../MarlinCore.h"
  34. #include "../../../../sd/cardreader.h"
  35. #include "../../../../gcode/queue.h"
  36. #include "../../../../module/temperature.h"
  37. #include "../../../../module/planner.h"
  38. #include "../../../../gcode/gcode.h"
  39. #if ENABLED(POWER_LOSS_RECOVERY)
  40. #include "../../../../feature/powerloss.h"
  41. #endif
  42. #if ENABLED(PARK_HEAD_ON_PAUSE)
  43. #include "../../../../feature/pause.h"
  44. #endif
  45. #include "../../../../gcode/gcode.h"
  46. extern lv_group_t * g;
  47. static lv_obj_t * scr;
  48. static lv_obj_t * tempText1;
  49. static lv_obj_t * filament_bar;
  50. extern uint8_t sel_id;
  51. extern uint8_t once_flag;
  52. extern uint8_t gcode_preview_over;
  53. extern int upload_result ;
  54. extern uint32_t upload_time;
  55. extern uint32_t upload_size;
  56. extern uint8_t temperature_change_frequency;
  57. static void btn_ok_event_cb(lv_obj_t * btn, lv_event_t event) {
  58. if (event == LV_EVENT_CLICKED) {
  59. // nothing to do
  60. }
  61. else if (event == LV_EVENT_RELEASED) {
  62. if (uiCfg.dialogType == DIALOG_TYPE_PRINT_FILE) {
  63. #if HAS_GCODE_PREVIEW
  64. preview_gcode_prehandle(list_file.file_name[sel_id]);
  65. #endif
  66. reset_print_time();
  67. start_print_time();
  68. uiCfg.print_state = WORKING;
  69. lv_clear_dialog();
  70. lv_draw_printing();
  71. #if ENABLED(SDSUPPORT)
  72. if (gcode_preview_over != 1) {
  73. char *cur_name;
  74. cur_name = strrchr(list_file.file_name[sel_id], '/');
  75. SdFile file, *curDir;
  76. card.endFilePrint();
  77. const char * const fname = card.diveToFile(true, curDir, cur_name);
  78. if (!fname) return;
  79. if (file.open(curDir, fname, O_READ)) {
  80. gCfgItems.curFilesize = file.fileSize();
  81. file.close();
  82. update_spi_flash();
  83. }
  84. card.openFileRead(cur_name);
  85. if (card.isFileOpen()) {
  86. feedrate_percentage = 100;
  87. //saved_feedrate_percentage = feedrate_percentage;
  88. planner.flow_percentage[0] = 100;
  89. planner.e_factor[0] = planner.flow_percentage[0] * 0.01f;
  90. #if HAS_MULTI_EXTRUDER
  91. planner.flow_percentage[1] = 100;
  92. planner.e_factor[1] = planner.flow_percentage[1] * 0.01f;
  93. #endif
  94. card.startFileprint();
  95. #if ENABLED(POWER_LOSS_RECOVERY)
  96. recovery.prepare();
  97. #endif
  98. once_flag = 0;
  99. }
  100. }
  101. #endif
  102. }
  103. else if (uiCfg.dialogType == DIALOG_TYPE_STOP) {
  104. wait_for_heatup = false;
  105. stop_print_time();
  106. lv_clear_dialog();
  107. lv_draw_ready_print();
  108. #if ENABLED(SDSUPPORT)
  109. //card.endFilePrint();
  110. //wait_for_heatup = false;
  111. uiCfg.print_state = IDLE;
  112. card.flag.abort_sd_printing = true;
  113. //queue.clear();
  114. //quickstop_stepper();
  115. //print_job_timer.stop();
  116. //thermalManager.disable_all_heaters();
  117. //#if ENABLED(POWER_LOSS_RECOVERY)
  118. // recovery.purge();
  119. //#endif
  120. //queue.enqueue_now_P(PSTR("G91\nG1 Z10\nG90\nG28 X0 Y0"));
  121. //queue.inject_P(PSTR("G91\nG1 Z10\nG90\nG28 X0 Y0\nM84\nM107"));
  122. #endif
  123. }
  124. else if (uiCfg.dialogType == DIALOG_TYPE_FINISH_PRINT) {
  125. clear_cur_ui();
  126. lv_draw_ready_print();
  127. }
  128. #if ENABLED(ADVANCED_PAUSE_FEATURE)
  129. else if (uiCfg.dialogType == DIALOG_PAUSE_MESSAGE_WAITING
  130. || uiCfg.dialogType == DIALOG_PAUSE_MESSAGE_INSERT
  131. || uiCfg.dialogType == DIALOG_PAUSE_MESSAGE_HEAT
  132. ) {
  133. wait_for_user = false;
  134. }
  135. else if (uiCfg.dialogType == DIALOG_PAUSE_MESSAGE_OPTION) {
  136. pause_menu_response = PAUSE_RESPONSE_EXTRUDE_MORE;
  137. }
  138. else if (uiCfg.dialogType == DIALOG_PAUSE_MESSAGE_RESUME) {
  139. clear_cur_ui();
  140. draw_return_ui();
  141. }
  142. #endif
  143. else if (uiCfg.dialogType == DIALOG_STORE_EEPROM_TIPS) {
  144. gcode.process_subcommands_now_P(PSTR("M500"));
  145. clear_cur_ui();
  146. draw_return_ui();
  147. }
  148. else if (uiCfg.dialogType == DIALOG_READ_EEPROM_TIPS) {
  149. gcode.process_subcommands_now_P(PSTR("M501"));
  150. clear_cur_ui();
  151. draw_return_ui();
  152. }
  153. else if (uiCfg.dialogType == DIALOG_REVERT_EEPROM_TIPS) {
  154. gcode.process_subcommands_now_P(PSTR("M502"));
  155. clear_cur_ui();
  156. draw_return_ui();
  157. }
  158. else if (uiCfg.dialogType == DIALOG_WIFI_CONFIG_TIPS) {
  159. uiCfg.configWifi = 1;
  160. clear_cur_ui();
  161. draw_return_ui();
  162. }
  163. else if (uiCfg.dialogType == DIALOG_TYPE_FILAMENT_HEAT_LOAD_COMPLETED) {
  164. uiCfg.filament_heat_completed_load = 1;
  165. }
  166. else if (uiCfg.dialogType == DIALOG_TYPE_FILAMENT_HEAT_UNLOAD_COMPLETED) {
  167. uiCfg.filament_heat_completed_unload = 1;
  168. }
  169. else if (uiCfg.dialogType == DIALOG_TYPE_FILAMENT_LOAD_COMPLETED
  170. || uiCfg.dialogType == DIALOG_TYPE_FILAMENT_UNLOAD_COMPLETED
  171. ) {
  172. clear_cur_ui();
  173. draw_return_ui();
  174. }
  175. }
  176. }
  177. static void btn_cancel_event_cb(lv_obj_t * btn, lv_event_t event) {
  178. if (event == LV_EVENT_CLICKED) {
  179. // nothing to do
  180. }
  181. else if (event == LV_EVENT_RELEASED) {
  182. if (uiCfg.dialogType == DIALOG_PAUSE_MESSAGE_OPTION) {
  183. #if ENABLED(ADVANCED_PAUSE_FEATURE)
  184. pause_menu_response = PAUSE_RESPONSE_RESUME_PRINT;
  185. #endif
  186. }
  187. else if ((uiCfg.dialogType == DIALOG_TYPE_FILAMENT_LOAD_HEAT)
  188. || (uiCfg.dialogType == DIALOG_TYPE_FILAMENT_UNLOAD_HEAT)
  189. || (uiCfg.dialogType == DIALOG_TYPE_FILAMENT_HEAT_LOAD_COMPLETED)
  190. || (uiCfg.dialogType == DIALOG_TYPE_FILAMENT_HEAT_UNLOAD_COMPLETED)
  191. ) {
  192. thermalManager.temp_hotend[uiCfg.curSprayerChoose].target= uiCfg.desireSprayerTempBak;
  193. clear_cur_ui();
  194. draw_return_ui();
  195. }
  196. else if ((uiCfg.dialogType == DIALOG_TYPE_FILAMENT_LOADING)
  197. || (uiCfg.dialogType == DIALOG_TYPE_FILAMENT_UNLOADING)
  198. ) {
  199. queue.enqueue_one_P(PSTR("M410"));
  200. uiCfg.filament_rate = 0;
  201. uiCfg.filament_loading_completed = 0;
  202. uiCfg.filament_unloading_completed = 0;
  203. uiCfg.filament_loading_time_flg = 0;
  204. uiCfg.filament_loading_time_cnt = 0;
  205. uiCfg.filament_unloading_time_flg = 0;
  206. uiCfg.filament_unloading_time_cnt = 0;
  207. thermalManager.temp_hotend[uiCfg.curSprayerChoose].target = uiCfg.desireSprayerTempBak;
  208. clear_cur_ui();
  209. draw_return_ui();
  210. }
  211. else {
  212. clear_cur_ui();
  213. draw_return_ui();
  214. }
  215. }
  216. }
  217. void lv_draw_dialog(uint8_t type) {
  218. lv_obj_t * btnOk = NULL;
  219. lv_obj_t * btnCancel = NULL;
  220. if (disp_state_stack._disp_state[disp_state_stack._disp_index] != DIALOG_UI) {
  221. disp_state_stack._disp_index++;
  222. disp_state_stack._disp_state[disp_state_stack._disp_index] = DIALOG_UI;
  223. }
  224. disp_state = DIALOG_UI;
  225. uiCfg.dialogType = type;
  226. scr = lv_obj_create(NULL, NULL);
  227. lv_obj_set_style(scr, &tft_style_scr);
  228. lv_scr_load(scr);
  229. lv_obj_clean(scr);
  230. lv_obj_t * title = lv_label_create(scr, NULL);
  231. lv_obj_set_style(title, &tft_style_label_rel);
  232. lv_obj_set_pos(title, TITLE_XPOS, TITLE_YPOS);
  233. lv_label_set_text(title, creat_title_text());
  234. lv_refr_now(lv_refr_get_disp_refreshing());
  235. static lv_style_t style_btn_rel; // A variable to store the released style
  236. lv_style_copy(&style_btn_rel, &lv_style_plain); // Initialize from a built-in style
  237. style_btn_rel.body.border.color = lv_color_hex3(0x269);
  238. style_btn_rel.body.border.width = 1;
  239. style_btn_rel.body.main_color = lv_color_hex3(0xADF);
  240. style_btn_rel.body.grad_color = lv_color_hex3(0x46B);
  241. style_btn_rel.body.shadow.width = 4;
  242. style_btn_rel.body.shadow.type = LV_SHADOW_BOTTOM;
  243. style_btn_rel.body.radius = LV_RADIUS_CIRCLE;
  244. style_btn_rel.text.color = lv_color_hex3(0xDEF);
  245. style_btn_rel.text.font = &TERN(HAS_SPI_FLASH_FONT, gb2312_puhui32, lv_font_roboto_22);
  246. static lv_style_t style_btn_pr; // A variable to store the pressed style
  247. lv_style_copy(&style_btn_pr, &style_btn_rel); // Initialize from the released style
  248. style_btn_pr.body.border.color = lv_color_hex3(0x46B);
  249. style_btn_pr.body.main_color = lv_color_hex3(0x8BD);
  250. style_btn_pr.body.grad_color = lv_color_hex3(0x24A);
  251. style_btn_pr.body.shadow.width = 2;
  252. style_btn_pr.text.color = lv_color_hex3(0xBCD);
  253. style_btn_pr.text.font = &TERN(HAS_SPI_FLASH_FONT, gb2312_puhui32, lv_font_roboto_22);
  254. lv_obj_t *labelDialog = lv_label_create(scr, NULL);
  255. lv_obj_set_style(labelDialog, &tft_style_label_rel);
  256. if (uiCfg.dialogType == DIALOG_TYPE_FINISH_PRINT || uiCfg.dialogType == DIALOG_PAUSE_MESSAGE_RESUME) {
  257. btnOk = lv_btn_create(scr, NULL); // Add a button the current screen
  258. lv_obj_set_pos(btnOk, BTN_OK_X + 90, BTN_OK_Y); // Set its position
  259. lv_obj_set_size(btnOk, 100, 50); // Set its size
  260. lv_obj_set_event_cb(btnOk, btn_ok_event_cb);
  261. lv_btn_set_style(btnOk, LV_BTN_STYLE_REL, &style_btn_rel); // Set the button's released style
  262. lv_btn_set_style(btnOk, LV_BTN_STYLE_PR, &style_btn_pr); // Set the button's pressed style
  263. lv_obj_t *labelOk = lv_label_create(btnOk, NULL); // Add a label to the button
  264. lv_label_set_text(labelOk, print_file_dialog_menu.confirm); // Set the labels text
  265. }
  266. else if (uiCfg.dialogType == DIALOG_PAUSE_MESSAGE_WAITING
  267. || uiCfg.dialogType == DIALOG_PAUSE_MESSAGE_INSERT
  268. || uiCfg.dialogType == DIALOG_PAUSE_MESSAGE_HEAT
  269. ) {
  270. btnOk = lv_btn_create(scr, NULL); // Add a button the current screen
  271. lv_obj_set_pos(btnOk, BTN_OK_X + 90, BTN_OK_Y); // Set its position
  272. lv_obj_set_size(btnOk, 100, 50); // Set its size
  273. lv_obj_set_event_cb(btnOk, btn_ok_event_cb);
  274. lv_btn_set_style(btnOk, LV_BTN_STYLE_REL, &style_btn_rel); // Set the button's released style
  275. lv_btn_set_style(btnOk, LV_BTN_STYLE_PR, &style_btn_pr); // Set the button's pressed style
  276. lv_obj_t *labelOk = lv_label_create(btnOk, NULL); // Add a label to the button
  277. lv_label_set_text(labelOk, print_file_dialog_menu.confirm); // Set the labels text
  278. }
  279. else if (uiCfg.dialogType == DIALOG_PAUSE_MESSAGE_PAUSING
  280. || uiCfg.dialogType == DIALOG_PAUSE_MESSAGE_CHANGING
  281. || uiCfg.dialogType == DIALOG_PAUSE_MESSAGE_UNLOAD
  282. || uiCfg.dialogType == DIALOG_PAUSE_MESSAGE_LOAD
  283. || uiCfg.dialogType == DIALOG_PAUSE_MESSAGE_PURGE
  284. || uiCfg.dialogType == DIALOG_PAUSE_MESSAGE_RESUME
  285. || uiCfg.dialogType == DIALOG_PAUSE_MESSAGE_HEATING
  286. ) {
  287. // nothing to do
  288. }
  289. else if (uiCfg.dialogType == WIFI_ENABLE_TIPS) {
  290. btnCancel = lv_btn_create(scr, NULL);
  291. lv_obj_set_pos(btnCancel, BTN_OK_X+90, BTN_OK_Y);
  292. lv_obj_set_size(btnCancel, 100, 50);
  293. lv_obj_set_event_cb(btnCancel, btn_cancel_event_cb);
  294. lv_btn_set_style(btnCancel, LV_BTN_STYLE_REL, &style_btn_rel);
  295. lv_btn_set_style(btnCancel, LV_BTN_STYLE_PR, &style_btn_pr);
  296. lv_obj_t *labelCancel = lv_label_create(btnCancel, NULL);
  297. lv_label_set_text(labelCancel, print_file_dialog_menu.cancle);
  298. }
  299. else if (uiCfg.dialogType == DIALOG_TRANSFER_NO_DEVICE) {
  300. btnCancel = lv_btn_create(scr, NULL);
  301. lv_obj_set_pos(btnCancel, BTN_OK_X+90, BTN_OK_Y);
  302. lv_obj_set_size(btnCancel, 100, 50);
  303. lv_obj_set_event_cb(btnCancel, btn_cancel_event_cb);
  304. lv_btn_set_style(btnCancel, LV_BTN_STYLE_REL, &style_btn_rel);
  305. lv_btn_set_style(btnCancel, LV_BTN_STYLE_PR, &style_btn_pr);
  306. lv_obj_t *labelCancel = lv_label_create(btnCancel, NULL);
  307. lv_label_set_text(labelCancel, print_file_dialog_menu.cancle);
  308. }
  309. #if ENABLED(USE_WIFI_FUNCTION)
  310. else if (uiCfg.dialogType == DIALOG_TYPE_UPLOAD_FILE) {
  311. if (upload_result == 2) {
  312. btnCancel = lv_btn_create(scr, NULL);
  313. lv_obj_set_pos(btnCancel, BTN_OK_X+90, BTN_OK_Y);
  314. lv_obj_set_size(btnCancel, 100, 50);
  315. lv_obj_set_event_cb(btnCancel, btn_cancel_event_cb);
  316. lv_btn_set_style(btnCancel, LV_BTN_STYLE_REL, &style_btn_rel);
  317. lv_btn_set_style(btnCancel, LV_BTN_STYLE_PR, &style_btn_pr);
  318. lv_obj_t *labelCancel = lv_label_create(btnCancel, NULL);
  319. lv_label_set_text(labelCancel, print_file_dialog_menu.cancle);
  320. }
  321. else if (upload_result == 3) {
  322. btnOk = lv_btn_create(scr, NULL);
  323. lv_obj_set_pos(btnOk, BTN_OK_X+90, BTN_OK_Y);
  324. lv_obj_set_size(btnOk, 100, 50);
  325. lv_obj_set_event_cb(btnOk, btn_ok_event_cb);
  326. lv_btn_set_style(btnOk, LV_BTN_STYLE_REL, &style_btn_rel);
  327. lv_btn_set_style(btnOk, LV_BTN_STYLE_PR, &style_btn_pr);
  328. lv_obj_t *labelOk = lv_label_create(btnOk, NULL);
  329. lv_label_set_text(labelOk, print_file_dialog_menu.confirm);
  330. }
  331. }
  332. #endif //USE_WIFI_FUNCTION
  333. else if (uiCfg.dialogType == DIALOG_TYPE_FILAMENT_LOAD_HEAT
  334. || uiCfg.dialogType == DIALOG_TYPE_FILAMENT_UNLOAD_HEAT
  335. ) {
  336. btnCancel = lv_btn_create(scr, NULL);
  337. lv_obj_set_pos(btnCancel, BTN_OK_X+90, BTN_OK_Y);
  338. lv_obj_set_size(btnCancel, 100, 50);
  339. lv_obj_set_event_cb(btnCancel, btn_cancel_event_cb);
  340. lv_btn_set_style(btnCancel, LV_BTN_STYLE_REL, &style_btn_rel);
  341. lv_btn_set_style(btnCancel, LV_BTN_STYLE_PR, &style_btn_pr);
  342. lv_obj_t *labelCancel = lv_label_create(btnCancel, NULL);
  343. lv_label_set_text(labelCancel, print_file_dialog_menu.cancle);
  344. tempText1 = lv_label_create(scr, NULL);
  345. lv_obj_set_style(tempText1, &tft_style_label_rel);
  346. filament_sprayer_temp();
  347. }
  348. else if (uiCfg.dialogType == DIALOG_TYPE_FILAMENT_LOAD_COMPLETED
  349. || uiCfg.dialogType == DIALOG_TYPE_FILAMENT_UNLOAD_COMPLETED
  350. ) {
  351. btnOk = lv_btn_create(scr, NULL);
  352. lv_obj_set_pos(btnOk, BTN_OK_X+90, BTN_OK_Y);
  353. lv_obj_set_size(btnOk, 100, 50);
  354. lv_obj_set_event_cb(btnOk, btn_ok_event_cb);
  355. lv_btn_set_style(btnOk, LV_BTN_STYLE_REL, &style_btn_rel);
  356. lv_btn_set_style(btnOk, LV_BTN_STYLE_PR, &style_btn_pr);
  357. lv_obj_t *labelOk = lv_label_create(btnOk, NULL);
  358. lv_label_set_text(labelOk, print_file_dialog_menu.confirm);
  359. }
  360. else if (uiCfg.dialogType == DIALOG_TYPE_FILAMENT_LOADING
  361. || uiCfg.dialogType == DIALOG_TYPE_FILAMENT_UNLOADING
  362. ) {
  363. btnCancel = lv_btn_create(scr, NULL);
  364. lv_obj_set_pos(btnCancel, BTN_OK_X+90, BTN_OK_Y);
  365. lv_obj_set_size(btnCancel, 100, 50);
  366. lv_obj_set_event_cb(btnCancel, btn_cancel_event_cb);
  367. lv_btn_set_style(btnCancel, LV_BTN_STYLE_REL, &style_btn_rel);
  368. lv_btn_set_style(btnCancel, LV_BTN_STYLE_PR, &style_btn_pr);
  369. lv_obj_t *labelCancel = lv_label_create(btnCancel, NULL);
  370. lv_label_set_text(labelCancel, print_file_dialog_menu.cancle);
  371. filament_bar = lv_bar_create(scr, NULL);
  372. lv_obj_set_pos(filament_bar, (TFT_WIDTH-400)/2, ((TFT_HEIGHT - titleHeight)-40)/2);
  373. lv_obj_set_size(filament_bar, 400, 25);
  374. lv_bar_set_style(filament_bar, LV_BAR_STYLE_INDIC, &lv_bar_style_indic);
  375. lv_bar_set_anim_time(filament_bar, 1000);
  376. lv_bar_set_value(filament_bar, 0, LV_ANIM_ON);
  377. }
  378. else {
  379. btnOk = lv_btn_create(scr, NULL); // Add a button the current screen
  380. lv_obj_set_pos(btnOk, BTN_OK_X, BTN_OK_Y); // Set its position
  381. lv_obj_set_size(btnOk, 100, 50); // Set its size
  382. lv_obj_set_event_cb(btnOk, btn_ok_event_cb);
  383. lv_btn_set_style(btnOk, LV_BTN_STYLE_REL, &style_btn_rel); // Set the button's released style
  384. lv_btn_set_style(btnOk, LV_BTN_STYLE_PR, &style_btn_pr); // Set the button's pressed style
  385. lv_obj_t *labelOk = lv_label_create(btnOk, NULL); // Add a label to the button
  386. btnCancel = lv_btn_create(scr, NULL); // Add a button the current screen
  387. lv_obj_set_pos(btnCancel, BTN_CANCEL_X, BTN_CANCEL_Y); // Set its position
  388. lv_obj_set_size(btnCancel, 100, 50); // Set its size
  389. lv_obj_set_event_cb(btnCancel, btn_cancel_event_cb);
  390. lv_btn_set_style(btnCancel, LV_BTN_STYLE_REL, &style_btn_rel); // Set the button's released style
  391. lv_btn_set_style(btnCancel, LV_BTN_STYLE_PR, &style_btn_pr); // Set the button's pressed style
  392. lv_obj_t *labelCancel = lv_label_create(btnCancel, NULL); // Add a label to the button
  393. if (uiCfg.dialogType == DIALOG_PAUSE_MESSAGE_OPTION) {
  394. lv_label_set_text(labelOk, pause_msg_menu.purgeMore); // Set the labels text
  395. lv_label_set_text(labelCancel, pause_msg_menu.continuePrint);
  396. }
  397. else {
  398. lv_label_set_text(labelOk, print_file_dialog_menu.confirm); // Set the labels text
  399. lv_label_set_text(labelCancel, print_file_dialog_menu.cancle);
  400. }
  401. }
  402. if (uiCfg.dialogType == DIALOG_TYPE_PRINT_FILE) {
  403. lv_label_set_text(labelDialog, print_file_dialog_menu.print_file);
  404. lv_obj_align(labelDialog, NULL, LV_ALIGN_CENTER, 0, -20);
  405. lv_obj_t *labelFile = lv_label_create(scr, NULL);
  406. lv_obj_set_style(labelFile, &tft_style_label_rel);
  407. lv_label_set_text(labelFile, list_file.long_name[sel_id]);
  408. lv_obj_align(labelFile, NULL, LV_ALIGN_CENTER, 0, -60);
  409. }
  410. else if (uiCfg.dialogType == DIALOG_TYPE_STOP) {
  411. lv_label_set_text(labelDialog, print_file_dialog_menu.cancle_print);
  412. lv_obj_align(labelDialog, NULL, LV_ALIGN_CENTER, 0, -20);
  413. }
  414. else if (uiCfg.dialogType == DIALOG_TYPE_FINISH_PRINT) {
  415. lv_label_set_text(labelDialog, print_file_dialog_menu.print_finish);
  416. lv_obj_align(labelDialog, NULL, LV_ALIGN_CENTER, 0, -20);
  417. }
  418. else if (uiCfg.dialogType == DIALOG_PAUSE_MESSAGE_PAUSING) {
  419. lv_label_set_text(labelDialog, pause_msg_menu.pausing);
  420. lv_obj_align(labelDialog, NULL, LV_ALIGN_CENTER, 0, -20);
  421. }
  422. else if (uiCfg.dialogType == DIALOG_PAUSE_MESSAGE_CHANGING) {
  423. lv_label_set_text(labelDialog, pause_msg_menu.changing);
  424. lv_obj_align(labelDialog, NULL, LV_ALIGN_CENTER, 0, -20);
  425. }
  426. else if (uiCfg.dialogType == DIALOG_PAUSE_MESSAGE_UNLOAD) {
  427. lv_label_set_text(labelDialog, pause_msg_menu.unload);
  428. lv_obj_align(labelDialog, NULL, LV_ALIGN_CENTER, 0, -20);
  429. }
  430. else if (uiCfg.dialogType == DIALOG_PAUSE_MESSAGE_WAITING) {
  431. lv_label_set_text(labelDialog, pause_msg_menu.waiting);
  432. lv_obj_align(labelDialog, NULL, LV_ALIGN_CENTER, 0, -20);
  433. }
  434. else if (uiCfg.dialogType == DIALOG_PAUSE_MESSAGE_INSERT) {
  435. lv_label_set_text(labelDialog, pause_msg_menu.insert);
  436. lv_obj_align(labelDialog, NULL, LV_ALIGN_CENTER, 0, -20);
  437. }
  438. else if (uiCfg.dialogType == DIALOG_PAUSE_MESSAGE_LOAD) {
  439. lv_label_set_text(labelDialog, pause_msg_menu.load);
  440. lv_obj_align(labelDialog, NULL, LV_ALIGN_CENTER, 0, -20);
  441. }
  442. else if (uiCfg.dialogType == DIALOG_PAUSE_MESSAGE_PURGE) {
  443. lv_label_set_text(labelDialog, pause_msg_menu.purge);
  444. lv_obj_align(labelDialog, NULL, LV_ALIGN_CENTER, 0, -20);
  445. }
  446. else if (uiCfg.dialogType == DIALOG_PAUSE_MESSAGE_RESUME) {
  447. lv_label_set_text(labelDialog, pause_msg_menu.resume);
  448. lv_obj_align(labelDialog, NULL, LV_ALIGN_CENTER, 0, -20);
  449. }
  450. else if (uiCfg.dialogType == DIALOG_PAUSE_MESSAGE_HEAT) {
  451. lv_label_set_text(labelDialog, pause_msg_menu.heat);
  452. lv_obj_align(labelDialog, NULL, LV_ALIGN_CENTER, 0, -20);
  453. }
  454. else if (uiCfg.dialogType == DIALOG_PAUSE_MESSAGE_HEATING) {
  455. lv_label_set_text(labelDialog, pause_msg_menu.heating);
  456. lv_obj_align(labelDialog, NULL, LV_ALIGN_CENTER, 0, -20);
  457. }
  458. else if (uiCfg.dialogType == DIALOG_PAUSE_MESSAGE_OPTION) {
  459. lv_label_set_text(labelDialog, pause_msg_menu.option);
  460. lv_obj_align(labelDialog, NULL, LV_ALIGN_CENTER, 0, -20);
  461. }
  462. else if (uiCfg.dialogType == DIALOG_STORE_EEPROM_TIPS) {
  463. lv_label_set_text(labelDialog, eeprom_menu.storeTips);
  464. lv_obj_align(labelDialog, NULL, LV_ALIGN_CENTER, 0, -20);
  465. }
  466. else if (uiCfg.dialogType == DIALOG_READ_EEPROM_TIPS) {
  467. lv_label_set_text(labelDialog, eeprom_menu.readTips);
  468. lv_obj_align(labelDialog, NULL, LV_ALIGN_CENTER, 0, -20);
  469. }
  470. else if (uiCfg.dialogType == DIALOG_REVERT_EEPROM_TIPS) {
  471. lv_label_set_text(labelDialog, eeprom_menu.revertTips);
  472. lv_obj_align(labelDialog, NULL, LV_ALIGN_CENTER, 0, -20);
  473. }
  474. else if (uiCfg.dialogType == DIALOG_WIFI_CONFIG_TIPS) {
  475. lv_label_set_text(labelDialog, machine_menu.wifiConfigTips);
  476. lv_obj_align(labelDialog, NULL, LV_ALIGN_CENTER, 0, -20);
  477. }
  478. else if (uiCfg.dialogType == WIFI_ENABLE_TIPS) {
  479. lv_label_set_text(labelDialog, print_file_dialog_menu.wifi_enable_tips);
  480. lv_obj_align(labelDialog, NULL, LV_ALIGN_CENTER, 0, -20);
  481. }
  482. else if (uiCfg.dialogType == DIALOG_TRANSFER_NO_DEVICE) {
  483. lv_label_set_text(labelDialog, DIALOG_UPDATE_NO_DEVICE_EN);
  484. lv_obj_align(labelDialog, NULL, LV_ALIGN_CENTER, 0, -20);
  485. }
  486. #if ENABLED(USE_WIFI_FUNCTION)
  487. else if (uiCfg.dialogType == DIALOG_TYPE_UPLOAD_FILE) {
  488. if (upload_result == 1) {
  489. lv_label_set_text(labelDialog, DIALOG_UPLOAD_ING_EN);
  490. lv_obj_align(labelDialog, NULL, LV_ALIGN_CENTER, 0, -20);
  491. }
  492. else if (upload_result == 2) {
  493. lv_label_set_text(labelDialog, DIALOG_UPLOAD_ERROR_EN);
  494. lv_obj_align(labelDialog, NULL, LV_ALIGN_CENTER, 0, -20);
  495. }
  496. else if (upload_result == 3) {
  497. char buf[200];
  498. int _index = 0;
  499. ZERO(buf);
  500. strcpy(buf, DIALOG_UPLOAD_FINISH_EN);
  501. _index = strlen(buf);
  502. buf[_index] = '\n';
  503. _index++;
  504. strcat(buf, DIALOG_UPLOAD_SIZE_EN);
  505. _index = strlen(buf);
  506. buf[_index] = ':';
  507. _index++;
  508. sprintf(&buf[_index], " %d KBytes\n", (int)(upload_size / 1024));
  509. strcat(buf, DIALOG_UPLOAD_TIME_EN);
  510. _index = strlen(buf);
  511. buf[_index] = ':';
  512. _index++;
  513. sprintf(&buf[_index], " %d s\n", (int)upload_time);
  514. strcat(buf, DIALOG_UPLOAD_SPEED_EN);
  515. _index = strlen(buf);
  516. buf[_index] = ':';
  517. _index++;
  518. sprintf(&buf[_index], " %d KBytes/s\n", (int)(upload_size / upload_time / 1024));
  519. lv_label_set_text(labelDialog, buf);
  520. lv_obj_align(labelDialog, NULL, LV_ALIGN_CENTER, 0, -20);
  521. }
  522. }
  523. #endif //USE_WIFI_FUNCTION
  524. else if (uiCfg.dialogType == DIALOG_TYPE_FILAMENT_LOAD_HEAT) {
  525. lv_label_set_text(labelDialog, filament_menu.filament_dialog_load_heat);
  526. lv_obj_align(labelDialog, NULL, LV_ALIGN_CENTER, 0, -20);
  527. }
  528. else if (uiCfg.dialogType == DIALOG_TYPE_FILAMENT_HEAT_LOAD_COMPLETED) {
  529. lv_label_set_text(labelDialog, filament_menu.filament_dialog_load_heat_confirm);
  530. lv_obj_align(labelDialog, NULL, LV_ALIGN_CENTER, 0, -20);
  531. }
  532. else if (uiCfg.dialogType == DIALOG_TYPE_FILAMENT_UNLOAD_HEAT) {
  533. lv_label_set_text(labelDialog, filament_menu.filament_dialog_unload_heat);
  534. lv_obj_align(labelDialog, NULL, LV_ALIGN_CENTER, 0, -20);
  535. }
  536. else if (uiCfg.dialogType == DIALOG_TYPE_FILAMENT_HEAT_UNLOAD_COMPLETED) {
  537. lv_label_set_text(labelDialog, filament_menu.filament_dialog_unload_heat_confirm);
  538. lv_obj_align(labelDialog, NULL, LV_ALIGN_CENTER, 0, -20);
  539. }
  540. else if (uiCfg.dialogType == DIALOG_TYPE_FILAMENT_LOAD_COMPLETED) {
  541. lv_label_set_text(labelDialog, filament_menu.filament_dialog_load_completed);
  542. lv_obj_align(labelDialog, NULL, LV_ALIGN_CENTER, 0, -20);
  543. }
  544. else if (uiCfg.dialogType == DIALOG_TYPE_FILAMENT_UNLOAD_COMPLETED) {
  545. lv_label_set_text(labelDialog, filament_menu.filament_dialog_unload_completed);
  546. lv_obj_align(labelDialog, NULL, LV_ALIGN_CENTER, 0, -20);
  547. }
  548. else if (uiCfg.dialogType == DIALOG_TYPE_FILAMENT_LOADING) {
  549. lv_label_set_text(labelDialog, filament_menu.filament_dialog_loading);
  550. lv_obj_align(labelDialog, NULL, LV_ALIGN_CENTER, 0, -70);
  551. }
  552. else if (uiCfg.dialogType == DIALOG_TYPE_FILAMENT_UNLOADING) {
  553. lv_label_set_text(labelDialog, filament_menu.filament_dialog_unloading);
  554. lv_obj_align(labelDialog, NULL, LV_ALIGN_CENTER, 0, -70);
  555. }
  556. #if HAS_ROTARY_ENCODER
  557. if (gCfgItems.encoder_enable) {
  558. if (btnOk) lv_group_add_obj(g, btnOk);
  559. if (btnCancel) lv_group_add_obj(g, btnCancel);
  560. }
  561. #endif
  562. }
  563. void filament_sprayer_temp() {
  564. char buf[20] = {0};
  565. public_buf_l[0] = '\0';
  566. if (uiCfg.curSprayerChoose < 1)
  567. strcat(public_buf_l, preheat_menu.ext1);
  568. else
  569. strcat(public_buf_l, preheat_menu.ext2);
  570. sprintf(buf, preheat_menu.value_state, (int)thermalManager.temp_hotend[uiCfg.curSprayerChoose].celsius, (int)thermalManager.temp_hotend[uiCfg.curSprayerChoose].target);
  571. strcat_P(public_buf_l, PSTR(": "));
  572. strcat(public_buf_l, buf);
  573. lv_label_set_text(tempText1, public_buf_l);
  574. lv_obj_align(tempText1, NULL, LV_ALIGN_CENTER, 0, -50);
  575. }
  576. void filament_dialog_handle() {
  577. if ((temperature_change_frequency == 1)
  578. && ((uiCfg.dialogType == DIALOG_TYPE_FILAMENT_LOAD_HEAT)
  579. || (uiCfg.dialogType == DIALOG_TYPE_FILAMENT_UNLOAD_HEAT))
  580. ) {
  581. filament_sprayer_temp();
  582. temperature_change_frequency = 0;
  583. }
  584. if (uiCfg.filament_heat_completed_load == 1) {
  585. uiCfg.filament_heat_completed_load = 0;
  586. lv_clear_dialog();
  587. lv_draw_dialog(DIALOG_TYPE_FILAMENT_LOADING);
  588. planner.synchronize();
  589. uiCfg.filament_loading_time_flg = 1;
  590. uiCfg.filament_loading_time_cnt = 0;
  591. ZERO(public_buf_m);
  592. sprintf_P(public_buf_m,PSTR("T%d\nG91\nG1 E%d F%d\nG90"),uiCfg.curSprayerChoose,gCfgItems.filamentchange_load_length,gCfgItems.filamentchange_load_speed);
  593. queue.inject_P(PSTR(public_buf_m));
  594. //gcode.process_subcommands_now_P(PSTR(public_buf_m));
  595. }
  596. if (uiCfg.filament_heat_completed_unload == 1) {
  597. uiCfg.filament_heat_completed_unload = 0;
  598. lv_clear_dialog();
  599. lv_draw_dialog(DIALOG_TYPE_FILAMENT_UNLOADING);
  600. planner.synchronize();
  601. uiCfg.filament_unloading_time_flg = 1;
  602. uiCfg.filament_unloading_time_cnt = 0;
  603. ZERO(public_buf_m);
  604. sprintf_P(public_buf_m,PSTR("T%d\nG91\nG1 E-%d F%d\nG90"),uiCfg.curSprayerChoose,gCfgItems.filamentchange_unload_length,gCfgItems.filamentchange_unload_speed);
  605. queue.inject_P(PSTR(public_buf_m));
  606. }
  607. if (((abs((int)((int)thermalManager.temp_hotend[uiCfg.curSprayerChoose].celsius - gCfgItems.filament_limit_temper)) <= 1)
  608. || ((int)thermalManager.temp_hotend[uiCfg.curSprayerChoose].celsius > gCfgItems.filament_limit_temper))
  609. && (uiCfg.filament_load_heat_flg == 1)
  610. ) {
  611. uiCfg.filament_load_heat_flg = 0;
  612. lv_clear_dialog();
  613. lv_draw_dialog(DIALOG_TYPE_FILAMENT_HEAT_LOAD_COMPLETED);
  614. }
  615. if (uiCfg.filament_loading_completed == 1) {
  616. uiCfg.filament_rate = 0;
  617. uiCfg.filament_loading_completed = 0;
  618. lv_clear_dialog();
  619. lv_draw_dialog(DIALOG_TYPE_FILAMENT_LOAD_COMPLETED);
  620. }
  621. if (((abs((int)((int)thermalManager.temp_hotend[uiCfg.curSprayerChoose].celsius - gCfgItems.filament_limit_temper)) <= 1)
  622. || ((int)thermalManager.temp_hotend[uiCfg.curSprayerChoose].celsius > gCfgItems.filament_limit_temper))
  623. && (uiCfg.filament_unload_heat_flg == 1)
  624. ) {
  625. uiCfg.filament_unload_heat_flg = 0;
  626. lv_clear_dialog();
  627. lv_draw_dialog(DIALOG_TYPE_FILAMENT_HEAT_UNLOAD_COMPLETED);
  628. }
  629. if (uiCfg.filament_unloading_completed == 1) {
  630. uiCfg.filament_rate = 0;
  631. uiCfg.filament_unloading_completed = 0;
  632. lv_clear_dialog();
  633. lv_draw_dialog(DIALOG_TYPE_FILAMENT_UNLOAD_COMPLETED);
  634. }
  635. if ( uiCfg.dialogType == DIALOG_TYPE_FILAMENT_LOADING
  636. || uiCfg.dialogType == DIALOG_TYPE_FILAMENT_UNLOADING
  637. ) lv_filament_setbar();
  638. }
  639. void lv_filament_setbar() {
  640. lv_bar_set_value(filament_bar, uiCfg.filament_rate, LV_ANIM_ON);
  641. }
  642. void lv_clear_dialog() {
  643. #if HAS_ROTARY_ENCODER
  644. if (gCfgItems.encoder_enable) lv_group_remove_all_objs(g);
  645. #endif
  646. lv_obj_del(scr);
  647. }
  648. #endif // HAS_TFT_LVGL_UI