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

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564
  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 "draw_ui.h"
  28. #include <lv_conf.h>
  29. #include "../../../../sd/cardreader.h"
  30. #include "../../../../gcode/queue.h"
  31. #include "../../../../module/temperature.h"
  32. #include "../../../../module/planner.h"
  33. #include "../../../../gcode/gcode.h"
  34. #include "../../../../inc/MarlinConfig.h"
  35. #if ENABLED(EEPROM_SETTINGS)
  36. #include "../../../../module/settings.h"
  37. #endif
  38. #if ENABLED(POWER_LOSS_RECOVERY)
  39. #include "../../../../feature/powerloss.h"
  40. #endif
  41. #if ENABLED(PARK_HEAD_ON_PAUSE)
  42. #include "../../../../feature/pause.h"
  43. #endif
  44. #if ENABLED(TOUCH_SCREEN_CALIBRATION)
  45. #include "../../../tft_io/touch_calibration.h"
  46. #include "draw_touch_calibration.h"
  47. #endif
  48. extern lv_group_t *g;
  49. static lv_obj_t *scr, *tempText1, *filament_bar;
  50. extern uint8_t sel_id;
  51. extern bool once_flag, gcode_preview_over;
  52. extern int upload_result;
  53. extern uint32_t upload_time;
  54. extern uint32_t upload_size;
  55. extern bool temps_update_flag;
  56. static void btn_ok_event_cb(lv_obj_t *btn, lv_event_t event) {
  57. if (event != LV_EVENT_RELEASED) return;
  58. if (DIALOG_IS(TYPE_PRINT_FILE)) {
  59. #if HAS_GCODE_PREVIEW
  60. preview_gcode_prehandle(list_file.file_name[sel_id]);
  61. #endif
  62. reset_print_time();
  63. start_print_time();
  64. uiCfg.print_state = WORKING;
  65. lv_clear_dialog();
  66. lv_draw_printing();
  67. #if ENABLED(SDSUPPORT)
  68. if (!gcode_preview_over) {
  69. char *cur_name;
  70. cur_name = strrchr(list_file.file_name[sel_id], '/');
  71. SdFile file, *curDir;
  72. card.endFilePrint();
  73. const char * const fname = card.diveToFile(true, curDir, cur_name);
  74. if (!fname) return;
  75. if (file.open(curDir, fname, O_READ)) {
  76. gCfgItems.curFilesize = file.fileSize();
  77. file.close();
  78. update_spi_flash();
  79. }
  80. card.openFileRead(cur_name);
  81. if (card.isFileOpen()) {
  82. feedrate_percentage = 100;
  83. planner.flow_percentage[0] = 100;
  84. planner.e_factor[0] = planner.flow_percentage[0] * 0.01f;
  85. #if HAS_MULTI_EXTRUDER
  86. planner.flow_percentage[1] = 100;
  87. planner.e_factor[1] = planner.flow_percentage[1] * 0.01f;
  88. #endif
  89. card.startFileprint();
  90. #if ENABLED(POWER_LOSS_RECOVERY)
  91. recovery.prepare();
  92. #endif
  93. once_flag = false;
  94. }
  95. }
  96. #endif
  97. }
  98. else if (DIALOG_IS(TYPE_STOP)) {
  99. wait_for_heatup = false;
  100. stop_print_time();
  101. lv_clear_dialog();
  102. lv_draw_ready_print();
  103. #if ENABLED(SDSUPPORT)
  104. uiCfg.print_state = IDLE;
  105. card.flag.abort_sd_printing = true;
  106. #endif
  107. }
  108. else if (DIALOG_IS(TYPE_FINISH_PRINT)) {
  109. clear_cur_ui();
  110. lv_draw_ready_print();
  111. }
  112. #if ENABLED(ADVANCED_PAUSE_FEATURE)
  113. else if (DIALOG_IS(PAUSE_MESSAGE_WAITING, PAUSE_MESSAGE_INSERT, PAUSE_MESSAGE_HEAT))
  114. wait_for_user = false;
  115. else if (DIALOG_IS(PAUSE_MESSAGE_OPTION))
  116. pause_menu_response = PAUSE_RESPONSE_EXTRUDE_MORE;
  117. else if (DIALOG_IS(PAUSE_MESSAGE_RESUME)) {
  118. clear_cur_ui();
  119. draw_return_ui();
  120. }
  121. #endif
  122. else if (DIALOG_IS(STORE_EEPROM_TIPS)) {
  123. TERN_(EEPROM_SETTINGS, (void)settings.save());
  124. clear_cur_ui();
  125. draw_return_ui();
  126. }
  127. else if (DIALOG_IS(READ_EEPROM_TIPS)) {
  128. TERN_(EEPROM_SETTINGS, (void)settings.load());
  129. clear_cur_ui();
  130. draw_return_ui();
  131. }
  132. else if (DIALOG_IS(REVERT_EEPROM_TIPS)) {
  133. TERN_(EEPROM_SETTINGS, (void)settings.reset());
  134. clear_cur_ui();
  135. #if ENABLED(TOUCH_SCREEN_CALIBRATION)
  136. const bool do_draw_cal = touch_calibration.need_calibration();
  137. if (do_draw_cal) {
  138. disp_state_stack._disp_index--; // We are asynchronous from the dialog, so let's remove the dialog from the stack
  139. lv_draw_touch_calibration_screen();
  140. }
  141. #else
  142. constexpr bool do_draw_cal = false;
  143. #endif
  144. if (!do_draw_cal) draw_return_ui();
  145. }
  146. else if (DIALOG_IS(WIFI_CONFIG_TIPS)) {
  147. uiCfg.configWifi = true;
  148. clear_cur_ui();
  149. draw_return_ui();
  150. }
  151. else if (DIALOG_IS(TYPE_FILAMENT_HEAT_LOAD_COMPLETED))
  152. uiCfg.filament_heat_completed_load = true;
  153. else if (DIALOG_IS(TYPE_FILAMENT_HEAT_UNLOAD_COMPLETED))
  154. uiCfg.filament_heat_completed_unload = true;
  155. else if (DIALOG_IS(TYPE_FILAMENT_LOAD_COMPLETED, TYPE_FILAMENT_UNLOAD_COMPLETED)) {
  156. clear_cur_ui();
  157. draw_return_ui();
  158. }
  159. #if ENABLED(MKS_WIFI_MODULE)
  160. else if (DIALOG_IS(TYPE_UNBIND)) {
  161. cloud_unbind();
  162. clear_cur_ui();
  163. draw_return_ui();
  164. }
  165. #endif
  166. else {
  167. clear_cur_ui();
  168. draw_return_ui();
  169. }
  170. }
  171. static void btn_cancel_event_cb(lv_obj_t *btn, lv_event_t event) {
  172. if (event != LV_EVENT_RELEASED) return;
  173. if (DIALOG_IS(PAUSE_MESSAGE_OPTION)) {
  174. TERN_(ADVANCED_PAUSE_FEATURE, pause_menu_response = PAUSE_RESPONSE_RESUME_PRINT);
  175. }
  176. else if (DIALOG_IS(TYPE_FILAMENT_LOAD_HEAT, TYPE_FILAMENT_UNLOAD_HEAT, TYPE_FILAMENT_HEAT_LOAD_COMPLETED, TYPE_FILAMENT_HEAT_UNLOAD_COMPLETED)) {
  177. thermalManager.setTargetHotend(uiCfg.hotendTargetTempBak, uiCfg.extruderIndex);
  178. clear_cur_ui();
  179. draw_return_ui();
  180. }
  181. else if (DIALOG_IS(TYPE_FILAMENT_LOADING, TYPE_FILAMENT_UNLOADING)) {
  182. queue.enqueue_one_P(PSTR("M410"));
  183. uiCfg.filament_rate = 0;
  184. uiCfg.filament_loading_completed = false;
  185. uiCfg.filament_unloading_completed = false;
  186. uiCfg.filament_loading_time_flg = false;
  187. uiCfg.filament_loading_time_cnt = 0;
  188. uiCfg.filament_unloading_time_flg = false;
  189. uiCfg.filament_unloading_time_cnt = 0;
  190. thermalManager.setTargetHotend(uiCfg.hotendTargetTempBak, uiCfg.extruderIndex);
  191. clear_cur_ui();
  192. draw_return_ui();
  193. }
  194. else {
  195. clear_cur_ui();
  196. draw_return_ui();
  197. }
  198. }
  199. void lv_draw_dialog(uint8_t type) {
  200. lv_obj_t *btnOk = nullptr, *btnCancel = nullptr;
  201. uiCfg.dialogType = type;
  202. scr = lv_screen_create(DIALOG_UI);
  203. lv_obj_t *labelDialog = lv_label_create(scr, "");
  204. if (DIALOG_IS(TYPE_FINISH_PRINT, PAUSE_MESSAGE_RESUME)) {
  205. btnOk = lv_button_btn_create(scr, BTN_OK_X + 90, BTN_OK_Y, 100, 50, btn_ok_event_cb);
  206. lv_obj_t *labelOk = lv_label_create_empty(btnOk); // Add a label to the button
  207. lv_label_set_text(labelOk, print_file_dialog_menu.confirm); // Set the labels text
  208. }
  209. else if (DIALOG_IS(PAUSE_MESSAGE_WAITING, PAUSE_MESSAGE_INSERT, PAUSE_MESSAGE_HEAT)) {
  210. btnOk = lv_button_btn_create(scr, BTN_OK_X + 90, BTN_OK_Y, 100, 50, btn_ok_event_cb);
  211. lv_obj_t *labelOk = lv_label_create_empty(btnOk); // Add a label to the button
  212. lv_label_set_text(labelOk, print_file_dialog_menu.confirm); // Set the labels text
  213. }
  214. else if (DIALOG_IS(PAUSE_MESSAGE_PAUSING, PAUSE_MESSAGE_CHANGING, PAUSE_MESSAGE_UNLOAD, PAUSE_MESSAGE_LOAD, PAUSE_MESSAGE_PURGE, PAUSE_MESSAGE_RESUME, PAUSE_MESSAGE_HEATING)) {
  215. // nothing to do
  216. }
  217. else if (DIALOG_IS(WIFI_ENABLE_TIPS)) {
  218. btnCancel = lv_button_btn_create(scr, BTN_OK_X + 90, BTN_OK_Y, 100, 50, btn_cancel_event_cb);
  219. lv_obj_t *labelCancel = lv_label_create_empty(btnCancel);
  220. lv_label_set_text(labelCancel, print_file_dialog_menu.cancel);
  221. }
  222. else if (DIALOG_IS(TRANSFER_NO_DEVICE)) {
  223. btnCancel = lv_button_btn_create(scr, BTN_OK_X + 90, BTN_OK_Y, 100, 50, btn_cancel_event_cb);
  224. lv_obj_t *labelCancel = lv_label_create_empty(btnCancel);
  225. lv_label_set_text(labelCancel, print_file_dialog_menu.cancel);
  226. }
  227. #if ENABLED(MKS_WIFI_MODULE)
  228. else if (DIALOG_IS(TYPE_UPLOAD_FILE)) {
  229. if (upload_result == 2) {
  230. btnCancel = lv_button_btn_create(scr, BTN_OK_X + 90, BTN_OK_Y, 100, 50, btn_cancel_event_cb);
  231. lv_obj_t *labelCancel = lv_label_create_empty(btnCancel);
  232. lv_label_set_text(labelCancel, print_file_dialog_menu.cancel);
  233. }
  234. else if (upload_result == 3) {
  235. btnOk = lv_button_btn_create(scr, BTN_OK_X + 90, BTN_OK_Y, 100, 50, btn_ok_event_cb);
  236. lv_obj_t *labelOk = lv_label_create_empty(btnOk);
  237. lv_label_set_text(labelOk, print_file_dialog_menu.confirm);
  238. }
  239. }
  240. else if (DIALOG_IS(TYPE_UPDATE_ESP_FIRMWARE)) {
  241. // nothing to do
  242. }
  243. #endif
  244. else if (DIALOG_IS(TYPE_FILAMENT_LOAD_HEAT, TYPE_FILAMENT_UNLOAD_HEAT)) {
  245. btnCancel = lv_button_btn_create(scr, BTN_OK_X+90, BTN_OK_Y, 100, 50, btn_cancel_event_cb);
  246. lv_obj_t *labelCancel = lv_label_create_empty(btnCancel);
  247. lv_label_set_text(labelCancel, print_file_dialog_menu.cancel);
  248. tempText1 = lv_label_create_empty(scr);
  249. filament_sprayer_temp();
  250. }
  251. else if (DIALOG_IS(TYPE_FILAMENT_LOAD_COMPLETED, TYPE_FILAMENT_UNLOAD_COMPLETED)) {
  252. btnOk = lv_button_btn_create(scr, BTN_OK_X + 90, BTN_OK_Y, 100, 50, btn_ok_event_cb);
  253. lv_obj_t *labelOk = lv_label_create_empty(btnOk);
  254. lv_label_set_text(labelOk, print_file_dialog_menu.confirm);
  255. }
  256. else if (DIALOG_IS(TYPE_FILAMENT_LOADING, TYPE_FILAMENT_UNLOADING)) {
  257. btnCancel = lv_button_btn_create(scr, BTN_OK_X + 90, BTN_OK_Y, 100, 50, btn_cancel_event_cb);
  258. lv_obj_t *labelCancel = lv_label_create_empty(btnCancel);
  259. lv_label_set_text(labelCancel, print_file_dialog_menu.cancel);
  260. filament_bar = lv_bar_create(scr, nullptr);
  261. lv_obj_set_pos(filament_bar, (TFT_WIDTH-400)/2, ((TFT_HEIGHT - titleHeight)-40)/2);
  262. lv_obj_set_size(filament_bar, 400, 25);
  263. lv_bar_set_style(filament_bar, LV_BAR_STYLE_INDIC, &lv_bar_style_indic);
  264. lv_bar_set_anim_time(filament_bar, 1000);
  265. lv_bar_set_value(filament_bar, 0, LV_ANIM_ON);
  266. }
  267. else {
  268. btnOk = lv_button_btn_create(scr, BTN_OK_X, BTN_OK_Y, 100, 50, btn_ok_event_cb);
  269. lv_obj_t *labelOk = lv_label_create_empty(btnOk); // Add a label to the button
  270. btnCancel = lv_button_btn_create(scr, BTN_CANCEL_X, BTN_CANCEL_Y, 100, 50, btn_cancel_event_cb);
  271. lv_obj_t *labelCancel = lv_label_create_empty(btnCancel); // Add a label to the button
  272. if (DIALOG_IS(PAUSE_MESSAGE_OPTION)) {
  273. lv_label_set_text(labelOk, pause_msg_menu.purgeMore); // Set the labels text
  274. lv_label_set_text(labelCancel, pause_msg_menu.continuePrint);
  275. }
  276. else {
  277. lv_label_set_text(labelOk, print_file_dialog_menu.confirm); // Set the labels text
  278. lv_label_set_text(labelCancel, print_file_dialog_menu.cancel);
  279. }
  280. }
  281. if (DIALOG_IS(TYPE_PRINT_FILE)) {
  282. lv_label_set_text(labelDialog, print_file_dialog_menu.print_file);
  283. lv_obj_align(labelDialog, nullptr, LV_ALIGN_CENTER, 0, -20);
  284. lv_obj_t *labelFile = lv_label_create(scr, list_file.long_name[sel_id]);
  285. lv_obj_align(labelFile, nullptr, LV_ALIGN_CENTER, 0, -60);
  286. }
  287. else if (DIALOG_IS(TYPE_STOP)) {
  288. lv_label_set_text(labelDialog, print_file_dialog_menu.cancel_print);
  289. lv_obj_align(labelDialog, nullptr, LV_ALIGN_CENTER, 0, -20);
  290. }
  291. else if (DIALOG_IS(TYPE_FINISH_PRINT)) {
  292. lv_label_set_text(labelDialog, print_file_dialog_menu.print_finish);
  293. lv_obj_align(labelDialog, nullptr, LV_ALIGN_CENTER, 0, -20);
  294. }
  295. else if (DIALOG_IS(PAUSE_MESSAGE_PAUSING)) {
  296. lv_label_set_text(labelDialog, pause_msg_menu.pausing);
  297. lv_obj_align(labelDialog, nullptr, LV_ALIGN_CENTER, 0, -20);
  298. }
  299. else if (DIALOG_IS(PAUSE_MESSAGE_CHANGING)) {
  300. lv_label_set_text(labelDialog, pause_msg_menu.changing);
  301. lv_obj_align(labelDialog, nullptr, LV_ALIGN_CENTER, 0, -20);
  302. }
  303. else if (DIALOG_IS(PAUSE_MESSAGE_UNLOAD)) {
  304. lv_label_set_text(labelDialog, pause_msg_menu.unload);
  305. lv_obj_align(labelDialog, nullptr, LV_ALIGN_CENTER, 0, -20);
  306. }
  307. else if (DIALOG_IS(PAUSE_MESSAGE_WAITING)) {
  308. lv_label_set_text(labelDialog, pause_msg_menu.waiting);
  309. lv_obj_align(labelDialog, nullptr, LV_ALIGN_CENTER, 0, -20);
  310. }
  311. else if (DIALOG_IS(PAUSE_MESSAGE_INSERT)) {
  312. lv_label_set_text(labelDialog, pause_msg_menu.insert);
  313. lv_obj_align(labelDialog, nullptr, LV_ALIGN_CENTER, 0, -20);
  314. }
  315. else if (DIALOG_IS(PAUSE_MESSAGE_LOAD)) {
  316. lv_label_set_text(labelDialog, pause_msg_menu.load);
  317. lv_obj_align(labelDialog, nullptr, LV_ALIGN_CENTER, 0, -20);
  318. }
  319. else if (DIALOG_IS(PAUSE_MESSAGE_PURGE)) {
  320. lv_label_set_text(labelDialog, pause_msg_menu.purge);
  321. lv_obj_align(labelDialog, nullptr, LV_ALIGN_CENTER, 0, -20);
  322. }
  323. else if (DIALOG_IS(PAUSE_MESSAGE_RESUME)) {
  324. lv_label_set_text(labelDialog, pause_msg_menu.resume);
  325. lv_obj_align(labelDialog, nullptr, LV_ALIGN_CENTER, 0, -20);
  326. }
  327. else if (DIALOG_IS(PAUSE_MESSAGE_HEAT)) {
  328. lv_label_set_text(labelDialog, pause_msg_menu.heat);
  329. lv_obj_align(labelDialog, nullptr, LV_ALIGN_CENTER, 0, -20);
  330. }
  331. else if (DIALOG_IS(PAUSE_MESSAGE_HEATING)) {
  332. lv_label_set_text(labelDialog, pause_msg_menu.heating);
  333. lv_obj_align(labelDialog, nullptr, LV_ALIGN_CENTER, 0, -20);
  334. }
  335. else if (DIALOG_IS(PAUSE_MESSAGE_OPTION)) {
  336. lv_label_set_text(labelDialog, pause_msg_menu.option);
  337. lv_obj_align(labelDialog, nullptr, LV_ALIGN_CENTER, 0, -20);
  338. }
  339. else if (DIALOG_IS(STORE_EEPROM_TIPS)) {
  340. lv_label_set_text(labelDialog, eeprom_menu.storeTips);
  341. lv_obj_align(labelDialog, nullptr, LV_ALIGN_CENTER, 0, -20);
  342. }
  343. else if (DIALOG_IS(READ_EEPROM_TIPS)) {
  344. lv_label_set_text(labelDialog, eeprom_menu.readTips);
  345. lv_obj_align(labelDialog, nullptr, LV_ALIGN_CENTER, 0, -20);
  346. }
  347. else if (DIALOG_IS(REVERT_EEPROM_TIPS)) {
  348. lv_label_set_text(labelDialog, eeprom_menu.revertTips);
  349. lv_obj_align(labelDialog, nullptr, LV_ALIGN_CENTER, 0, -20);
  350. }
  351. else if (DIALOG_IS(WIFI_CONFIG_TIPS)) {
  352. lv_label_set_text(labelDialog, machine_menu.wifiConfigTips);
  353. lv_obj_align(labelDialog, nullptr, LV_ALIGN_CENTER, 0, -20);
  354. }
  355. else if (DIALOG_IS(WIFI_ENABLE_TIPS)) {
  356. lv_label_set_text(labelDialog, print_file_dialog_menu.wifi_enable_tips);
  357. lv_obj_align(labelDialog, nullptr, LV_ALIGN_CENTER, 0, -20);
  358. }
  359. else if (DIALOG_IS(TRANSFER_NO_DEVICE)) {
  360. lv_label_set_text(labelDialog, DIALOG_UPDATE_NO_DEVICE_EN);
  361. lv_obj_align(labelDialog, nullptr, LV_ALIGN_CENTER, 0, -20);
  362. }
  363. #if ENABLED(MKS_WIFI_MODULE)
  364. else if (DIALOG_IS(TYPE_UPLOAD_FILE)) {
  365. if (upload_result == 1) {
  366. lv_label_set_text(labelDialog, DIALOG_UPLOAD_ING_EN);
  367. lv_obj_align(labelDialog, nullptr, LV_ALIGN_CENTER, 0, -20);
  368. }
  369. else if (upload_result == 2) {
  370. lv_label_set_text(labelDialog, DIALOG_UPLOAD_ERROR_EN);
  371. lv_obj_align(labelDialog, nullptr, LV_ALIGN_CENTER, 0, -20);
  372. }
  373. else if (upload_result == 3) {
  374. char buf[200];
  375. int _index = 0;
  376. strcpy(buf, DIALOG_UPLOAD_FINISH_EN);
  377. _index = strlen(buf);
  378. buf[_index] = '\n';
  379. _index++;
  380. strcat(buf, DIALOG_UPLOAD_SIZE_EN);
  381. _index = strlen(buf);
  382. buf[_index] = ':';
  383. _index++;
  384. sprintf(&buf[_index], " %d KBytes\n", (int)(upload_size / 1024));
  385. strcat(buf, DIALOG_UPLOAD_TIME_EN);
  386. _index = strlen(buf);
  387. buf[_index] = ':';
  388. _index++;
  389. sprintf(&buf[_index], " %d s\n", (int)upload_time);
  390. strcat(buf, DIALOG_UPLOAD_SPEED_EN);
  391. _index = strlen(buf);
  392. buf[_index] = ':';
  393. _index++;
  394. sprintf(&buf[_index], " %d KBytes/s\n", (int)(upload_size / upload_time / 1024));
  395. lv_label_set_text(labelDialog, buf);
  396. lv_obj_align(labelDialog, nullptr, LV_ALIGN_CENTER, 0, -20);
  397. }
  398. }
  399. else if (DIALOG_IS(TYPE_UPDATE_ESP_FIRMWARE)) {
  400. lv_label_set_text(labelDialog, DIALOG_UPDATE_WIFI_FIRMWARE_EN);
  401. lv_obj_align(labelDialog, NULL, LV_ALIGN_CENTER, 0, -20);
  402. }
  403. #endif // MKS_WIFI_MODULE
  404. else if (DIALOG_IS(TYPE_FILAMENT_LOAD_HEAT)) {
  405. lv_label_set_text(labelDialog, filament_menu.filament_dialog_load_heat);
  406. lv_obj_align(labelDialog, nullptr, LV_ALIGN_CENTER, 0, -20);
  407. }
  408. else if (DIALOG_IS(TYPE_FILAMENT_HEAT_LOAD_COMPLETED)) {
  409. lv_label_set_text(labelDialog, filament_menu.filament_dialog_load_heat_confirm);
  410. lv_obj_align(labelDialog, nullptr, LV_ALIGN_CENTER, 0, -20);
  411. }
  412. else if (DIALOG_IS(TYPE_FILAMENT_UNLOAD_HEAT)) {
  413. lv_label_set_text(labelDialog, filament_menu.filament_dialog_unload_heat);
  414. lv_obj_align(labelDialog, nullptr, LV_ALIGN_CENTER, 0, -20);
  415. }
  416. else if (DIALOG_IS(TYPE_FILAMENT_HEAT_UNLOAD_COMPLETED)) {
  417. lv_label_set_text(labelDialog, filament_menu.filament_dialog_unload_heat_confirm);
  418. lv_obj_align(labelDialog, nullptr, LV_ALIGN_CENTER, 0, -20);
  419. }
  420. else if (DIALOG_IS(TYPE_FILAMENT_LOAD_COMPLETED)) {
  421. lv_label_set_text(labelDialog, filament_menu.filament_dialog_load_completed);
  422. lv_obj_align(labelDialog, nullptr, LV_ALIGN_CENTER, 0, -20);
  423. }
  424. else if (DIALOG_IS(TYPE_FILAMENT_UNLOAD_COMPLETED)) {
  425. lv_label_set_text(labelDialog, filament_menu.filament_dialog_unload_completed);
  426. lv_obj_align(labelDialog, nullptr, LV_ALIGN_CENTER, 0, -20);
  427. }
  428. else if (DIALOG_IS(TYPE_FILAMENT_LOADING)) {
  429. lv_label_set_text(labelDialog, filament_menu.filament_dialog_loading);
  430. lv_obj_align(labelDialog, nullptr, LV_ALIGN_CENTER, 0, -70);
  431. }
  432. else if (DIALOG_IS(TYPE_FILAMENT_UNLOADING)) {
  433. lv_label_set_text(labelDialog, filament_menu.filament_dialog_unloading);
  434. lv_obj_align(labelDialog, nullptr, LV_ALIGN_CENTER, 0, -70);
  435. }
  436. #if ENABLED(MKS_WIFI_MODULE)
  437. else if (DIALOG_IS(TYPE_UNBIND)) {
  438. lv_label_set_text(labelDialog, common_menu.unbind_printer_tips);
  439. lv_obj_align(labelDialog, NULL, LV_ALIGN_CENTER, 0, -70);
  440. }
  441. #endif
  442. #if HAS_ROTARY_ENCODER
  443. if (gCfgItems.encoder_enable) {
  444. if (btnOk) lv_group_add_obj(g, btnOk);
  445. if (btnCancel) lv_group_add_obj(g, btnCancel);
  446. }
  447. #endif
  448. }
  449. void filament_sprayer_temp() {
  450. char buf[20] = {0};
  451. sprintf(buf, preheat_menu.value_state, (int)thermalManager.degHotend(uiCfg.extruderIndex), (int)thermalManager.degTargetHotend(uiCfg.extruderIndex));
  452. strcpy(public_buf_l, uiCfg.extruderIndex < 1 ? extrude_menu.ext1 : extrude_menu.ext2);
  453. strcat_P(public_buf_l, PSTR(": "));
  454. strcat(public_buf_l, buf);
  455. lv_label_set_text(tempText1, public_buf_l);
  456. lv_obj_align(tempText1, nullptr, LV_ALIGN_CENTER, 0, -50);
  457. }
  458. void filament_dialog_handle() {
  459. if (temps_update_flag && (DIALOG_IS(TYPE_FILAMENT_LOAD_HEAT, TYPE_FILAMENT_UNLOAD_HEAT))) {
  460. filament_sprayer_temp();
  461. temps_update_flag = false;
  462. }
  463. if (uiCfg.filament_heat_completed_load) {
  464. uiCfg.filament_heat_completed_load = false;
  465. lv_clear_dialog();
  466. lv_draw_dialog(DIALOG_TYPE_FILAMENT_LOADING);
  467. planner.synchronize();
  468. uiCfg.filament_loading_time_flg = true;
  469. uiCfg.filament_loading_time_cnt = 0;
  470. sprintf_P(public_buf_m, PSTR("T%d\nG91\nG1 E%d F%d\nG90"), uiCfg.extruderIndex, gCfgItems.filamentchange_load_length, gCfgItems.filamentchange_load_speed);
  471. queue.inject(public_buf_m);
  472. }
  473. if (uiCfg.filament_heat_completed_unload) {
  474. uiCfg.filament_heat_completed_unload = false;
  475. lv_clear_dialog();
  476. lv_draw_dialog(DIALOG_TYPE_FILAMENT_UNLOADING);
  477. planner.synchronize();
  478. uiCfg.filament_unloading_time_flg = true;
  479. uiCfg.filament_unloading_time_cnt = 0;
  480. sprintf_P(public_buf_m, PSTR("T%d\nG91\nG1 E-%d F%d\nG90"), uiCfg.extruderIndex, gCfgItems.filamentchange_unload_length, gCfgItems.filamentchange_unload_speed);
  481. queue.inject(public_buf_m);
  482. }
  483. if (uiCfg.filament_load_heat_flg) {
  484. const celsius_t diff = thermalManager.degHotend(uiCfg.extruderIndex) - gCfgItems.filament_limit_temp;
  485. if (abs(diff) < 2 || diff > 0) {
  486. uiCfg.filament_load_heat_flg = false;
  487. lv_clear_dialog();
  488. lv_draw_dialog(DIALOG_TYPE_FILAMENT_HEAT_LOAD_COMPLETED);
  489. }
  490. }
  491. if (uiCfg.filament_loading_completed) {
  492. uiCfg.filament_rate = 0;
  493. uiCfg.filament_loading_completed = false;
  494. lv_clear_dialog();
  495. lv_draw_dialog(DIALOG_TYPE_FILAMENT_LOAD_COMPLETED);
  496. }
  497. if (uiCfg.filament_unload_heat_flg) {
  498. const celsius_t diff = thermalManager.degHotend(uiCfg.extruderIndex) - gCfgItems.filament_limit_temp;
  499. if (abs(diff) < 2 || diff > 0) {
  500. uiCfg.filament_unload_heat_flg = false;
  501. lv_clear_dialog();
  502. lv_draw_dialog(DIALOG_TYPE_FILAMENT_HEAT_UNLOAD_COMPLETED);
  503. }
  504. }
  505. if (uiCfg.filament_unloading_completed) {
  506. uiCfg.filament_rate = 0;
  507. uiCfg.filament_unloading_completed = false;
  508. lv_clear_dialog();
  509. lv_draw_dialog(DIALOG_TYPE_FILAMENT_UNLOAD_COMPLETED);
  510. }
  511. if (DIALOG_IS(TYPE_FILAMENT_LOADING, TYPE_FILAMENT_UNLOADING))
  512. lv_filament_setbar();
  513. }
  514. void lv_filament_setbar() {
  515. lv_bar_set_value(filament_bar, uiCfg.filament_rate, LV_ANIM_ON);
  516. }
  517. void lv_clear_dialog() {
  518. #if HAS_ROTARY_ENCODER
  519. if (gCfgItems.encoder_enable) lv_group_remove_all_objs(g);
  520. #endif
  521. lv_obj_del(scr);
  522. }
  523. #endif // HAS_TFT_LVGL_UI