My Marlin configs for Fabrikator Mini and CTC i3 Pro B
Vous ne pouvez pas sélectionner plus de 25 sujets Les noms de sujets doivent commencer par une lettre ou un nombre, peuvent contenir des tirets ('-') et peuvent comporter jusqu'à 35 caractères.

draw_dialog.cpp 21KB

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