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

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