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.

DGUSRxHandler.cpp 27KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045
  1. /**
  2. * Marlin 3D Printer Firmware
  3. * Copyright (c) 2021 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 <http://www.gnu.org/licenses/>.
  20. *
  21. */
  22. #include "../../../inc/MarlinConfigPre.h"
  23. #if ENABLED(DGUS_LCD_UI_RELOADED)
  24. #include "DGUSRxHandler.h"
  25. #include "DGUSScreenHandler.h"
  26. #include "config/DGUS_Screen.h"
  27. #include "../ui_api.h"
  28. #include "../../../core/language.h"
  29. #include "../../../module/temperature.h"
  30. #include "../../../module/printcounter.h"
  31. #include "../../../module/stepper.h"
  32. #include "../../../gcode/queue.h"
  33. #if ENABLED(ADVANCED_PAUSE_FEATURE)
  34. #include "../../../feature/pause.h"
  35. #endif
  36. #if ENABLED(POWER_LOSS_RECOVERY)
  37. #include "../../../feature/powerloss.h"
  38. #endif
  39. void DGUSRxHandler::ScreenChange(DGUS_VP &vp, void *data_ptr) {
  40. const DGUS_Screen screen = (DGUS_Screen)((uint8_t*)data_ptr)[1];
  41. if (vp.addr == DGUS_Addr::SCREENCHANGE_SD) {
  42. #if ENABLED(SDSUPPORT)
  43. #if !PIN_EXISTS(SD_DETECT)
  44. card.mount();
  45. #endif
  46. if (!ExtUI::isMediaInserted()) {
  47. dgus_screen_handler.SetStatusMessagePGM(GET_TEXT(MSG_NO_MEDIA));
  48. return;
  49. }
  50. card.cdroot();
  51. #else
  52. dgus_screen_handler.SetStatusMessagePGM(GET_TEXT(MSG_NO_MEDIA));
  53. return;
  54. #endif
  55. }
  56. if (vp.addr == DGUS_Addr::SCREENCHANGE_Idle
  57. && (ExtUI::isPrinting() || ExtUI::isPrintingPaused())) {
  58. dgus_screen_handler.SetStatusMessagePGM(PSTR("Impossible while printing"));
  59. return;
  60. }
  61. if (vp.addr == DGUS_Addr::SCREENCHANGE_Printing
  62. && (!ExtUI::isPrinting() && !ExtUI::isPrintingPaused())) {
  63. dgus_screen_handler.SetStatusMessagePGM(PSTR("Impossible while idle"));
  64. return;
  65. }
  66. dgus_screen_handler.TriggerScreenChange(screen);
  67. }
  68. #if ENABLED(SDSUPPORT)
  69. void DGUSRxHandler::Scroll(DGUS_VP &vp, void *data_ptr) {
  70. UNUSED(vp);
  71. const DGUS_Data::Scroll scroll = (DGUS_Data::Scroll)((uint8_t*)data_ptr)[1];
  72. switch (scroll) {
  73. case DGUS_Data::Scroll::GO_BACK:
  74. if (dgus_screen_handler.filelist.isAtRootDir()) {
  75. return;
  76. }
  77. dgus_screen_handler.filelist_offset = 0;
  78. dgus_screen_handler.filelist_selected = -1;
  79. dgus_screen_handler.filelist.upDir();
  80. break;
  81. case DGUS_Data::Scroll::UP:
  82. if (dgus_screen_handler.filelist_offset < 1) {
  83. return;
  84. }
  85. --dgus_screen_handler.filelist_offset;
  86. break;
  87. case DGUS_Data::Scroll::DOWN:
  88. if (dgus_screen_handler.filelist_offset + 1 + DGUS_FILE_COUNT > dgus_screen_handler.filelist.count()) {
  89. return;
  90. }
  91. ++dgus_screen_handler.filelist_offset;
  92. break;
  93. }
  94. dgus_screen_handler.TriggerFullUpdate();
  95. }
  96. void DGUSRxHandler::SelectFile(DGUS_VP &vp, void *data_ptr) {
  97. UNUSED(vp);
  98. const uint8_t index = ((uint8_t*)data_ptr)[1];
  99. if (!dgus_screen_handler.filelist.seek(dgus_screen_handler.filelist_offset + index)) {
  100. return;
  101. }
  102. if (dgus_screen_handler.filelist.isDir()) {
  103. dgus_screen_handler.filelist_offset = 0;
  104. dgus_screen_handler.filelist_selected = -1;
  105. dgus_screen_handler.filelist.changeDir(dgus_screen_handler.filelist.filename());
  106. }
  107. else {
  108. dgus_screen_handler.filelist_selected = dgus_screen_handler.filelist_offset + index;
  109. }
  110. dgus_screen_handler.TriggerFullUpdate();
  111. }
  112. void DGUSRxHandler::PrintFile(DGUS_VP &vp, void *data_ptr) {
  113. UNUSED(vp);
  114. UNUSED(data_ptr);
  115. if (dgus_screen_handler.filelist_selected < 0) {
  116. dgus_screen_handler.SetStatusMessagePGM(PSTR("No file selected"));
  117. return;
  118. }
  119. if (!dgus_screen_handler.filelist.seek(dgus_screen_handler.filelist_selected)
  120. || dgus_screen_handler.filelist.isDir()) {
  121. return;
  122. }
  123. if (!dgus_screen_handler.IsPrinterIdle()) {
  124. dgus_screen_handler.SetStatusMessagePGM(DGUS_MSG_BUSY);
  125. return;
  126. }
  127. ExtUI::printFile(dgus_screen_handler.filelist.shortFilename());
  128. dgus_screen_handler.TriggerScreenChange(DGUS_Screen::PRINT_STATUS);
  129. }
  130. #endif // SDSUPPORT
  131. void DGUSRxHandler::PrintAbort(DGUS_VP &vp, void *data_ptr) {
  132. UNUSED(vp);
  133. const DGUS_Data::Popup result = (DGUS_Data::Popup)((uint8_t*)data_ptr)[1];
  134. if (result != DGUS_Data::Popup::CONFIRMED) {
  135. return;
  136. }
  137. if (!ExtUI::isPrinting() && !ExtUI::isPrintingPaused()) {
  138. dgus_screen_handler.TriggerFullUpdate();
  139. return;
  140. }
  141. ExtUI::stopPrint();
  142. }
  143. void DGUSRxHandler::PrintPause(DGUS_VP &vp, void *data_ptr) {
  144. UNUSED(vp);
  145. const DGUS_Data::Popup result = (DGUS_Data::Popup)((uint8_t*)data_ptr)[1];
  146. if (result != DGUS_Data::Popup::CONFIRMED) {
  147. return;
  148. }
  149. if (!ExtUI::isPrinting()) {
  150. dgus_screen_handler.TriggerFullUpdate();
  151. return;
  152. }
  153. ExtUI::pausePrint();
  154. }
  155. void DGUSRxHandler::PrintResume(DGUS_VP &vp, void *data_ptr) {
  156. UNUSED(vp);
  157. const DGUS_Data::Popup result = (DGUS_Data::Popup)((uint8_t*)data_ptr)[1];
  158. if (result != DGUS_Data::Popup::CONFIRMED) {
  159. return;
  160. }
  161. if (!ExtUI::isPrintingPaused()) {
  162. dgus_screen_handler.TriggerFullUpdate();
  163. return;
  164. }
  165. if (!dgus_screen_handler.IsPrinterIdle()) {
  166. dgus_screen_handler.SetStatusMessagePGM(DGUS_MSG_BUSY);
  167. return;
  168. }
  169. ExtUI::resumePrint();
  170. }
  171. void DGUSRxHandler::Feedrate(DGUS_VP &vp, void *data_ptr) {
  172. UNUSED(vp);
  173. const int16_t feedrate = Swap16(*(int16_t*)data_ptr);
  174. ExtUI::setFeedrate_percent(feedrate);
  175. dgus_screen_handler.TriggerFullUpdate();
  176. }
  177. void DGUSRxHandler::Flowrate(DGUS_VP &vp, void *data_ptr) {
  178. const int16_t flowrate = Swap16(*(int16_t*)data_ptr);
  179. switch (vp.addr) {
  180. default: return;
  181. case DGUS_Addr::ADJUST_SetFlowrate_CUR:
  182. ExtUI::setFlow_percent(flowrate, TERN(HAS_MULTI_EXTRUDER, ExtUI::getActiveTool(), ExtUI::E0));
  183. break;
  184. #if HAS_MULTI_EXTRUDER
  185. case DGUS_Addr::ADJUST_SetFlowrate_E0:
  186. ExtUI::setFlow_percent(flowrate, ExtUI::E0);
  187. break;
  188. case DGUS_Addr::ADJUST_SetFlowrate_E1:
  189. ExtUI::setFlow_percent(flowrate, ExtUI::E1);
  190. break;
  191. #endif
  192. }
  193. dgus_screen_handler.TriggerFullUpdate();
  194. }
  195. void DGUSRxHandler::BabystepSet(DGUS_VP &vp, void *data_ptr) {
  196. UNUSED(vp);
  197. const int16_t data = Swap16(*(int16_t*)data_ptr);
  198. const float offset = dgus_display.FromFixedPoint<int16_t, float, 2>(data);
  199. const int16_t steps = ExtUI::mmToWholeSteps(offset - ExtUI::getZOffset_mm(), ExtUI::Z);
  200. ExtUI::smartAdjustAxis_steps(steps, ExtUI::Z, true);
  201. dgus_screen_handler.TriggerEEPROMSave();
  202. dgus_screen_handler.TriggerFullUpdate();
  203. }
  204. void DGUSRxHandler::Babystep(DGUS_VP &vp, void *data_ptr) {
  205. UNUSED(vp);
  206. const DGUS_Data::Adjust adjust = (DGUS_Data::Adjust)((uint8_t*)data_ptr)[1];
  207. int16_t steps;
  208. switch (adjust) {
  209. default: return;
  210. case DGUS_Data::Adjust::INCREMENT:
  211. steps = ExtUI::mmToWholeSteps(DGUS_PRINT_BABYSTEP, ExtUI::Z);
  212. break;
  213. case DGUS_Data::Adjust::DECREMENT:
  214. steps = ExtUI::mmToWholeSteps(-DGUS_PRINT_BABYSTEP, ExtUI::Z);
  215. break;
  216. }
  217. ExtUI::smartAdjustAxis_steps(steps, ExtUI::Z, true);
  218. dgus_screen_handler.TriggerEEPROMSave();
  219. dgus_screen_handler.TriggerFullUpdate();
  220. }
  221. void DGUSRxHandler::TempPreset(DGUS_VP &vp, void *data_ptr) {
  222. UNUSED(vp);
  223. const DGUS_Data::TempPreset preset = (DGUS_Data::TempPreset)((uint8_t*)data_ptr)[1];
  224. switch (preset) {
  225. case DGUS_Data::TempPreset::PLA:
  226. #if HOTENDS < 2
  227. ExtUI::setTargetTemp_celsius(DGUS_PLA_TEMP_HOTEND, ExtUI::H0);
  228. #else
  229. ExtUI::setTargetTemp_celsius(DGUS_PLA_TEMP_HOTEND, ExtUI::getActiveTool());
  230. #endif
  231. ExtUI::setTargetTemp_celsius(DGUS_PLA_TEMP_BED, ExtUI::BED);
  232. break;
  233. case DGUS_Data::TempPreset::ABS:
  234. #if HOTENDS < 2
  235. ExtUI::setTargetTemp_celsius(DGUS_ABS_TEMP_HOTEND, ExtUI::H0);
  236. #else
  237. ExtUI::setTargetTemp_celsius(DGUS_ABS_TEMP_HOTEND, ExtUI::getActiveTool());
  238. #endif
  239. ExtUI::setTargetTemp_celsius(DGUS_ABS_TEMP_BED, ExtUI::BED);
  240. break;
  241. case DGUS_Data::TempPreset::PETG:
  242. #if HOTENDS < 2
  243. ExtUI::setTargetTemp_celsius(DGUS_PETG_TEMP_HOTEND, ExtUI::H0);
  244. #else
  245. ExtUI::setTargetTemp_celsius(DGUS_PETG_TEMP_HOTEND, ExtUI::getActiveTool());
  246. #endif
  247. ExtUI::setTargetTemp_celsius(DGUS_PETG_TEMP_BED, ExtUI::BED);
  248. break;
  249. }
  250. dgus_screen_handler.TriggerFullUpdate();
  251. }
  252. void DGUSRxHandler::TempTarget(DGUS_VP &vp, void *data_ptr) {
  253. const int16_t temp = Swap16(*(int16_t*)data_ptr);
  254. switch (vp.addr) {
  255. default: return;
  256. case DGUS_Addr::TEMP_SetTarget_Bed:
  257. ExtUI::setTargetTemp_celsius(temp, ExtUI::BED);
  258. break;
  259. case DGUS_Addr::TEMP_SetTarget_H0:
  260. ExtUI::setTargetTemp_celsius(temp, ExtUI::H0);
  261. break;
  262. #if HOTENDS > 1
  263. case DGUS_Addr::TEMP_SetTarget_H1:
  264. ExtUI::setTargetTemp_celsius(temp, ExtUI::H1);
  265. break;
  266. #endif
  267. }
  268. dgus_screen_handler.TriggerFullUpdate();
  269. }
  270. void DGUSRxHandler::TempCool(DGUS_VP &vp, void *data_ptr) {
  271. UNUSED(vp);
  272. const DGUS_Data::Heater heater = (DGUS_Data::Heater)Swap16(*(uint16_t*)data_ptr);
  273. switch (heater) {
  274. default: return;
  275. case DGUS_Data::Heater::ALL:
  276. ExtUI::setTargetTemp_celsius(0, ExtUI::BED);
  277. ExtUI::setTargetTemp_celsius(0, ExtUI::H0);
  278. #if HOTENDS > 1
  279. ExtUI::setTargetTemp_celsius(0, ExtUI::H1);
  280. #endif
  281. break;
  282. case DGUS_Data::Heater::BED:
  283. ExtUI::setTargetTemp_celsius(0, ExtUI::BED);
  284. break;
  285. case DGUS_Data::Heater::H0:
  286. ExtUI::setTargetTemp_celsius(0, ExtUI::H0);
  287. break;
  288. #if HOTENDS > 1
  289. case DGUS_Data::Heater::H1:
  290. ExtUI::setTargetTemp_celsius(0, ExtUI::H1);
  291. break;
  292. #endif
  293. }
  294. dgus_screen_handler.SetStatusMessagePGM(PSTR("Cooling..."));
  295. dgus_screen_handler.TriggerFullUpdate();
  296. }
  297. void DGUSRxHandler::Steppers(DGUS_VP &vp, void *data_ptr) {
  298. UNUSED(vp);
  299. const DGUS_Data::Control control = (DGUS_Data::Control)((uint8_t*)data_ptr)[1];
  300. switch (control) {
  301. case DGUS_Data::Control::ENABLE:
  302. stepper.enable_all_steppers();
  303. break;
  304. case DGUS_Data::Control::DISABLE:
  305. stepper.disable_all_steppers();
  306. break;
  307. }
  308. dgus_screen_handler.TriggerFullUpdate();
  309. }
  310. void DGUSRxHandler::ZOffset(DGUS_VP &vp, void *data_ptr) {
  311. UNUSED(vp);
  312. if (!ExtUI::isAxisPositionKnown(ExtUI::Z)) {
  313. dgus_screen_handler.SetStatusMessagePGM(DGUS_MSG_HOMING_REQUIRED);
  314. return;
  315. }
  316. if (!dgus_screen_handler.IsPrinterIdle()) {
  317. dgus_screen_handler.SetStatusMessagePGM(DGUS_MSG_BUSY);
  318. return;
  319. }
  320. const int16_t data = Swap16(*(int16_t*)data_ptr);
  321. const float offset = dgus_display.FromFixedPoint<int16_t, float, 2>(data);
  322. const int16_t steps = ExtUI::mmToWholeSteps(offset - ExtUI::getZOffset_mm(), ExtUI::Z);
  323. ExtUI::smartAdjustAxis_steps(steps, ExtUI::Z, true);
  324. dgus_screen_handler.TriggerEEPROMSave();
  325. dgus_screen_handler.TriggerFullUpdate();
  326. }
  327. void DGUSRxHandler::ZOffsetStep(DGUS_VP &vp, void *data_ptr) {
  328. UNUSED(vp);
  329. if (!ExtUI::isAxisPositionKnown(ExtUI::Z)) {
  330. dgus_screen_handler.SetStatusMessagePGM(DGUS_MSG_HOMING_REQUIRED);
  331. return;
  332. }
  333. if (!dgus_screen_handler.IsPrinterIdle()) {
  334. dgus_screen_handler.SetStatusMessagePGM(DGUS_MSG_BUSY);
  335. return;
  336. }
  337. const DGUS_Data::Adjust adjust = (DGUS_Data::Adjust)((uint8_t*)data_ptr)[1];
  338. int16_t steps;
  339. switch (dgus_screen_handler.offset_steps) {
  340. default: return;
  341. case DGUS_Data::StepSize::MMP1:
  342. steps = ExtUI::mmToWholeSteps((adjust == DGUS_Data::Adjust::INCREMENT ? 0.1f : -0.1f), ExtUI::Z);
  343. break;
  344. case DGUS_Data::StepSize::MMP01:
  345. steps = ExtUI::mmToWholeSteps((adjust == DGUS_Data::Adjust::INCREMENT ? 0.01f : -0.01f), ExtUI::Z);
  346. break;
  347. }
  348. ExtUI::smartAdjustAxis_steps(steps, ExtUI::Z, true);
  349. dgus_screen_handler.TriggerEEPROMSave();
  350. dgus_screen_handler.TriggerFullUpdate();
  351. }
  352. void DGUSRxHandler::ZOffsetSetStep(DGUS_VP &vp, void *data_ptr) {
  353. UNUSED(vp);
  354. const DGUS_Data::StepSize size = (DGUS_Data::StepSize)((uint8_t*)data_ptr)[1];
  355. dgus_screen_handler.offset_steps = size;
  356. dgus_screen_handler.TriggerFullUpdate();
  357. }
  358. void DGUSRxHandler::MoveToPoint(DGUS_VP &vp, void *data_ptr) {
  359. UNUSED(vp);
  360. if (!ExtUI::isPositionKnown()) {
  361. dgus_screen_handler.SetStatusMessagePGM(DGUS_MSG_HOMING_REQUIRED);
  362. return;
  363. }
  364. if (!dgus_screen_handler.IsPrinterIdle()) {
  365. dgus_screen_handler.SetStatusMessagePGM(DGUS_MSG_BUSY);
  366. return;
  367. }
  368. const uint8_t point = ((uint8_t*)data_ptr)[1];
  369. constexpr float lfrb[4] = LEVEL_CORNERS_INSET_LFRB;
  370. float x, y;
  371. switch (point) {
  372. default: return;
  373. case 1:
  374. x = DGUS_LEVEL_CENTER_X;
  375. y = DGUS_LEVEL_CENTER_Y;
  376. break;
  377. case 2:
  378. x = X_MIN_POS + lfrb[0];
  379. y = Y_MIN_POS + lfrb[1];
  380. break;
  381. case 3:
  382. x = X_MAX_POS - lfrb[2];
  383. y = Y_MIN_POS + lfrb[1];
  384. break;
  385. case 4:
  386. x = X_MAX_POS - lfrb[2];
  387. y = Y_MAX_POS - lfrb[3];
  388. break;
  389. case 5:
  390. x = X_MIN_POS + lfrb[0];
  391. y = Y_MAX_POS - lfrb[3];
  392. break;
  393. }
  394. if (ExtUI::getAxisPosition_mm(ExtUI::Z) < Z_MIN_POS + LEVEL_CORNERS_Z_HOP) {
  395. ExtUI::setAxisPosition_mm(Z_MIN_POS + LEVEL_CORNERS_Z_HOP, ExtUI::Z);
  396. }
  397. ExtUI::setAxisPosition_mm(x, ExtUI::X);
  398. ExtUI::setAxisPosition_mm(y, ExtUI::Y);
  399. ExtUI::setAxisPosition_mm(Z_MIN_POS + LEVEL_CORNERS_HEIGHT, ExtUI::Z);
  400. }
  401. void DGUSRxHandler::Probe(DGUS_VP &vp, void *data_ptr) {
  402. UNUSED(vp);
  403. UNUSED(data_ptr);
  404. #if ENABLED(MESH_BED_LEVELING)
  405. dgus_screen_handler.SetStatusMessagePGM(DGUS_MSG_ABL_REQUIRED);
  406. return;
  407. #endif
  408. if (!ExtUI::isPositionKnown()) {
  409. dgus_screen_handler.SetStatusMessagePGM(DGUS_MSG_HOMING_REQUIRED);
  410. return;
  411. }
  412. if (!dgus_screen_handler.IsPrinterIdle()) {
  413. dgus_screen_handler.SetStatusMessagePGM(DGUS_MSG_BUSY);
  414. return;
  415. }
  416. dgus_screen_handler.TriggerScreenChange(DGUS_Screen::LEVELING_PROBING);
  417. #if ENABLED(AUTO_BED_LEVELING_UBL)
  418. queue.enqueue_now(F("G29P1\nG29P3\nG29P5C"));
  419. #else
  420. queue.enqueue_now(F("G29"));
  421. #endif
  422. queue.enqueue_now_P(DGUS_CMD_EEPROM_SAVE);
  423. }
  424. void DGUSRxHandler::DisableABL(DGUS_VP &vp, void *data_ptr) {
  425. UNUSED(vp);
  426. UNUSED(data_ptr);
  427. if (!dgus_screen_handler.IsPrinterIdle()) {
  428. dgus_screen_handler.SetStatusMessagePGM(DGUS_MSG_BUSY);
  429. return;
  430. }
  431. ExtUI::setLevelingActive(false);
  432. dgus_screen_handler.TriggerEEPROMSave();
  433. dgus_screen_handler.TriggerFullUpdate();
  434. }
  435. void DGUSRxHandler::FilamentSelect(DGUS_VP &vp, void *data_ptr) {
  436. UNUSED(vp);
  437. const DGUS_Data::Extruder extruder = (DGUS_Data::Extruder)Swap16(*(uint16_t*)data_ptr);
  438. switch (extruder) {
  439. default: return;
  440. case DGUS_Data::Extruder::CURRENT:
  441. case DGUS_Data::Extruder::E0:
  442. E_TERN_(case DGUS_Data::Extruder::E1:)
  443. dgus_screen_handler.filament_extruder = extruder;
  444. break;
  445. }
  446. dgus_screen_handler.TriggerFullUpdate();
  447. }
  448. void DGUSRxHandler::FilamentLength(DGUS_VP &vp, void *data_ptr) {
  449. UNUSED(vp);
  450. const uint16_t length = Swap16(*(uint16_t*)data_ptr);
  451. dgus_screen_handler.filament_length = constrain(length, 0, EXTRUDE_MAXLENGTH);
  452. dgus_screen_handler.TriggerFullUpdate();
  453. }
  454. void DGUSRxHandler::FilamentMove(DGUS_VP &vp, void *data_ptr) {
  455. UNUSED(vp);
  456. if (!dgus_screen_handler.IsPrinterIdle()) {
  457. dgus_screen_handler.SetStatusMessagePGM(DGUS_MSG_BUSY);
  458. return;
  459. }
  460. ExtUI::extruder_t extruder;
  461. switch (dgus_screen_handler.filament_extruder) {
  462. default: return;
  463. case DGUS_Data::Extruder::CURRENT:
  464. #if HAS_MULTI_EXTRUDER
  465. extruder = ExtUI::getActiveTool();
  466. break;
  467. #endif
  468. case DGUS_Data::Extruder::E0:
  469. extruder = ExtUI::E0;
  470. break;
  471. #if HAS_MULTI_EXTRUDER
  472. case DGUS_Data::Extruder::E1:
  473. extruder = ExtUI::E1;
  474. break;
  475. #endif
  476. }
  477. if (ExtUI::getActualTemp_celsius(extruder) < (float)EXTRUDE_MINTEMP) {
  478. dgus_screen_handler.SetStatusMessagePGM(PSTR("Temperature too low"));
  479. return;
  480. }
  481. const DGUS_Data::FilamentMove move = (DGUS_Data::FilamentMove)((uint8_t*)data_ptr)[1];
  482. switch (move) {
  483. case DGUS_Data::FilamentMove::RETRACT:
  484. UI_DECREMENT_BY(AxisPosition_mm, (float)dgus_screen_handler.filament_length, extruder);
  485. break;
  486. case DGUS_Data::FilamentMove::EXTRUDE:
  487. UI_INCREMENT_BY(AxisPosition_mm, (float)dgus_screen_handler.filament_length, extruder);
  488. break;
  489. }
  490. }
  491. void DGUSRxHandler::Home(DGUS_VP &vp, void *data_ptr) {
  492. UNUSED(vp);
  493. if (!dgus_screen_handler.IsPrinterIdle()) {
  494. dgus_screen_handler.SetStatusMessagePGM(DGUS_MSG_BUSY);
  495. return;
  496. }
  497. DGUS_Data::Axis axis = (DGUS_Data::Axis)((uint8_t*)data_ptr)[1];
  498. dgus_screen_handler.SetMessageLinePGM(NUL_STR, 1);
  499. dgus_screen_handler.SetMessageLinePGM(DGUS_MSG_HOMING, 2);
  500. dgus_screen_handler.SetMessageLinePGM(NUL_STR, 3);
  501. dgus_screen_handler.SetMessageLinePGM(NUL_STR, 4);
  502. dgus_screen_handler.ShowWaitScreen(dgus_screen_handler.GetCurrentScreen());
  503. switch (axis) {
  504. case DGUS_Data::Axis::X_Y_Z:
  505. queue.enqueue_now(F("G28XYZ"));
  506. break;
  507. case DGUS_Data::Axis::X_Y:
  508. queue.enqueue_now(F("G28XY"));
  509. break;
  510. case DGUS_Data::Axis::Z:
  511. queue.enqueue_now(F("G28Z"));
  512. break;
  513. }
  514. }
  515. void DGUSRxHandler::Move(DGUS_VP &vp, void *data_ptr) {
  516. const int16_t data = Swap16(*(int16_t*)data_ptr);
  517. const float position = dgus_display.FromFixedPoint<int16_t, float, 1>(data);
  518. ExtUI::axis_t axis;
  519. switch (vp.addr) {
  520. default: return;
  521. case DGUS_Addr::MOVE_SetX:
  522. axis = ExtUI::X;
  523. break;
  524. case DGUS_Addr::MOVE_SetY:
  525. axis = ExtUI::Y;
  526. break;
  527. case DGUS_Addr::MOVE_SetZ:
  528. axis = ExtUI::Z;
  529. break;
  530. }
  531. if (!ExtUI::isAxisPositionKnown(axis)) {
  532. dgus_screen_handler.SetStatusMessagePGM(DGUS_MSG_HOMING_REQUIRED);
  533. return;
  534. }
  535. ExtUI::setAxisPosition_mm(position, axis);
  536. dgus_screen_handler.TriggerFullUpdate();
  537. }
  538. void DGUSRxHandler::MoveStep(DGUS_VP &vp, void *data_ptr) {
  539. UNUSED(vp);
  540. float offset;
  541. switch (dgus_screen_handler.move_steps) {
  542. default: return;
  543. case DGUS_Data::StepSize::MM10:
  544. offset = 10.0f;
  545. break;
  546. case DGUS_Data::StepSize::MM1:
  547. offset = 1.0f;
  548. break;
  549. case DGUS_Data::StepSize::MMP1:
  550. offset = 0.1f;
  551. break;
  552. }
  553. const DGUS_Data::MoveDirection direction = (DGUS_Data::MoveDirection)((uint8_t*)data_ptr)[1];
  554. ExtUI::axis_t axis;
  555. switch (direction) {
  556. default: return;
  557. case DGUS_Data::MoveDirection::XP:
  558. axis = ExtUI::X;
  559. break;
  560. case DGUS_Data::MoveDirection::XM:
  561. axis = ExtUI::X;
  562. offset = -offset;
  563. break;
  564. case DGUS_Data::MoveDirection::YP:
  565. axis = ExtUI::Y;
  566. break;
  567. case DGUS_Data::MoveDirection::YM:
  568. axis = ExtUI::Y;
  569. offset = -offset;
  570. break;
  571. case DGUS_Data::MoveDirection::ZP:
  572. axis = ExtUI::Z;
  573. break;
  574. case DGUS_Data::MoveDirection::ZM:
  575. axis = ExtUI::Z;
  576. offset = -offset;
  577. break;
  578. }
  579. if (!ExtUI::isAxisPositionKnown(axis)) {
  580. dgus_screen_handler.SetStatusMessagePGM(DGUS_MSG_HOMING_REQUIRED);
  581. return;
  582. }
  583. UI_INCREMENT_BY(AxisPosition_mm, offset, axis);
  584. dgus_screen_handler.TriggerFullUpdate();
  585. }
  586. void DGUSRxHandler::MoveSetStep(DGUS_VP &vp, void *data_ptr) {
  587. UNUSED(vp);
  588. const DGUS_Data::StepSize size = (DGUS_Data::StepSize)((uint8_t*)data_ptr)[1];
  589. dgus_screen_handler.move_steps = size;
  590. dgus_screen_handler.TriggerFullUpdate();
  591. }
  592. void DGUSRxHandler::GcodeClear(DGUS_VP &vp, void *data_ptr) {
  593. UNUSED(vp);
  594. UNUSED(data_ptr);
  595. ZERO(dgus_screen_handler.gcode);
  596. dgus_screen_handler.TriggerFullUpdate();
  597. }
  598. void DGUSRxHandler::GcodeExecute(DGUS_VP &vp, void *data_ptr) {
  599. UNUSED(vp);
  600. UNUSED(data_ptr);
  601. if (!strlen(dgus_screen_handler.gcode)) {
  602. return;
  603. }
  604. if (!dgus_screen_handler.IsPrinterIdle()) {
  605. dgus_screen_handler.SetStatusMessagePGM(DGUS_MSG_BUSY);
  606. return;
  607. }
  608. dgus_screen_handler.SetMessageLinePGM(NUL_STR, 1);
  609. dgus_screen_handler.SetMessageLinePGM(PSTR("Executing command..."), 2);
  610. dgus_screen_handler.SetMessageLinePGM(NUL_STR, 3);
  611. dgus_screen_handler.SetMessageLinePGM(NUL_STR, 4);
  612. dgus_screen_handler.ShowWaitScreen(DGUS_Screen::GCODE);
  613. queue.enqueue_one_now(dgus_screen_handler.gcode);
  614. }
  615. void DGUSRxHandler::ResetEEPROM(DGUS_VP &vp, void *data_ptr) {
  616. UNUSED(vp);
  617. const DGUS_Data::Popup result = (DGUS_Data::Popup)((uint8_t*)data_ptr)[1];
  618. if (result != DGUS_Data::Popup::CONFIRMED) {
  619. return;
  620. }
  621. if (!dgus_screen_handler.IsPrinterIdle()) {
  622. dgus_screen_handler.SetStatusMessagePGM(DGUS_MSG_BUSY);
  623. return;
  624. }
  625. queue.enqueue_now(F("M502"));
  626. queue.enqueue_now_P(DGUS_CMD_EEPROM_SAVE);
  627. }
  628. void DGUSRxHandler::SettingsExtra(DGUS_VP &vp, void *data_ptr) {
  629. UNUSED(vp);
  630. const DGUS_Data::Extra extra = (DGUS_Data::Extra)((uint8_t*)data_ptr)[1];
  631. switch (extra) {
  632. default: return;
  633. case DGUS_Data::Extra::BUTTON1:
  634. #if ENABLED(BLTOUCH)
  635. if (!dgus_screen_handler.IsPrinterIdle()) {
  636. dgus_screen_handler.SetStatusMessagePGM(DGUS_MSG_BUSY);
  637. return;
  638. }
  639. queue.enqueue_now(F(DGUS_RESET_BLTOUCH));
  640. #else
  641. dgus_screen_handler.TriggerScreenChange(DGUS_Screen::INFOS);
  642. #endif
  643. break;
  644. #if ENABLED(BLTOUCH)
  645. case DGUS_Data::Extra::BUTTON2:
  646. dgus_screen_handler.TriggerScreenChange(DGUS_Screen::INFOS);
  647. break;
  648. #endif
  649. }
  650. }
  651. void DGUSRxHandler::PIDSelect(DGUS_VP &vp, void *data_ptr) {
  652. UNUSED(vp);
  653. const DGUS_Data::Heater heater = (DGUS_Data::Heater)Swap16(*(uint16_t*)data_ptr);
  654. switch (heater) {
  655. default: return;
  656. case DGUS_Data::Heater::BED:
  657. dgus_screen_handler.pid_temp = DGUS_PLA_TEMP_BED;
  658. dgus_screen_handler.pid_heater = heater;
  659. break;
  660. case DGUS_Data::Heater::H0:
  661. #if HOTENDS > 1
  662. case DGUS_Data::Heater::H1:
  663. #endif
  664. dgus_screen_handler.pid_temp = DGUS_PLA_TEMP_HOTEND;
  665. dgus_screen_handler.pid_heater = heater;
  666. break;
  667. }
  668. dgus_screen_handler.pid_cycles = 5;
  669. dgus_screen_handler.TriggerFullUpdate();
  670. }
  671. void DGUSRxHandler::PIDSetTemp(DGUS_VP &vp, void *data_ptr) {
  672. UNUSED(vp);
  673. if (!dgus_screen_handler.IsPrinterIdle()) {
  674. dgus_screen_handler.SetStatusMessagePGM(DGUS_MSG_BUSY);
  675. return;
  676. }
  677. uint16_t temp = Swap16(*(uint16_t*)data_ptr);
  678. switch (dgus_screen_handler.pid_heater) {
  679. default: return;
  680. case DGUS_Data::Heater::BED:
  681. temp = constrain(temp, BED_MINTEMP, BED_MAX_TARGET);
  682. break;
  683. case DGUS_Data::Heater::H0:
  684. temp = constrain(temp, HEATER_0_MINTEMP, (HEATER_0_MAXTEMP - HOTEND_OVERSHOOT));
  685. break;
  686. #if HOTENDS > 1
  687. case DGUS_Data::Heater::H1:
  688. temp = constrain(temp, HEATER_1_MINTEMP, (HEATER_1_MAXTEMP - HOTEND_OVERSHOOT));
  689. break;
  690. #endif
  691. }
  692. dgus_screen_handler.pid_temp = temp;
  693. dgus_screen_handler.TriggerFullUpdate();
  694. }
  695. void DGUSRxHandler::PIDRun(DGUS_VP &vp, void *data_ptr) {
  696. UNUSED(vp);
  697. UNUSED(data_ptr);
  698. if (!dgus_screen_handler.IsPrinterIdle()) {
  699. dgus_screen_handler.SetStatusMessagePGM(DGUS_MSG_BUSY);
  700. return;
  701. }
  702. heater_id_t heater;
  703. uint8_t cycles = constrain(dgus_screen_handler.pid_cycles, 3, 10);
  704. switch (dgus_screen_handler.pid_heater) {
  705. default: return;
  706. case DGUS_Data::Heater::BED:
  707. #if ENABLED(PIDTEMPBED)
  708. heater = H_BED;
  709. break;
  710. #else
  711. dgus_screen_handler.SetStatusMessagePGM(PSTR("Bed PID disabled"));
  712. return;
  713. #endif
  714. case DGUS_Data::Heater::H0:
  715. #if ENABLED(PIDTEMP)
  716. heater = H_E0;
  717. break;
  718. #else
  719. dgus_screen_handler.SetStatusMessagePGM(PSTR("PID disabled"));
  720. return;
  721. #endif
  722. #if HOTENDS > 1
  723. case DGUS_Data::Heater::H1:
  724. #if ENABLED(PIDTEMP)
  725. heater = H_E1;
  726. break;
  727. #else
  728. dgus_screen_handler.SetStatusMessagePGM(PSTR("PID disabled"));
  729. return;
  730. #endif
  731. #endif
  732. }
  733. char buffer[24];
  734. snprintf_P(buffer, sizeof(buffer), PSTR("M303C%dE%dS%dU1"), cycles, heater, dgus_screen_handler.pid_temp);
  735. dgus_screen_handler.SetMessageLinePGM(NUL_STR, 1);
  736. dgus_screen_handler.SetMessageLinePGM(PSTR("PID autotuning..."), 2);
  737. dgus_screen_handler.SetMessageLinePGM(NUL_STR, 3);
  738. dgus_screen_handler.SetMessageLinePGM(NUL_STR, 4);
  739. dgus_screen_handler.ShowWaitScreen(DGUS_Screen::PID);
  740. queue.enqueue_one_now(buffer);
  741. queue.enqueue_now_P(DGUS_CMD_EEPROM_SAVE);
  742. }
  743. #if ENABLED(POWER_LOSS_RECOVERY)
  744. void DGUSRxHandler::PowerLossAbort(DGUS_VP &vp, void *data_ptr) {
  745. UNUSED(vp);
  746. const DGUS_Data::Popup result = (DGUS_Data::Popup)((uint8_t*)data_ptr)[1];
  747. if (result != DGUS_Data::Popup::CONFIRMED) {
  748. return;
  749. }
  750. if (!dgus_screen_handler.IsPrinterIdle()) {
  751. dgus_screen_handler.SetStatusMessagePGM(DGUS_MSG_BUSY);
  752. return;
  753. }
  754. dgus_screen_handler.TriggerScreenChange(DGUS_Screen::HOME);
  755. queue.enqueue_now(F("M1000C"));
  756. }
  757. void DGUSRxHandler::PowerLossResume(DGUS_VP &vp, void *data_ptr) {
  758. UNUSED(vp);
  759. const DGUS_Data::Popup result = (DGUS_Data::Popup)((uint8_t*)data_ptr)[1];
  760. if (result != DGUS_Data::Popup::CONFIRMED) {
  761. return;
  762. }
  763. if (!dgus_screen_handler.IsPrinterIdle()) {
  764. dgus_screen_handler.SetStatusMessagePGM(DGUS_MSG_BUSY);
  765. return;
  766. }
  767. if (!recovery.valid()) {
  768. dgus_screen_handler.SetStatusMessagePGM(PSTR("Invalid recovery data"));
  769. return;
  770. }
  771. dgus_screen_handler.TriggerScreenChange(DGUS_Screen::PRINT_STATUS);
  772. queue.enqueue_now(F("M1000"));
  773. }
  774. #endif // POWER_LOSS_RECOVERY
  775. void DGUSRxHandler::WaitAbort(DGUS_VP &vp, void *data_ptr) {
  776. UNUSED(vp);
  777. const DGUS_Data::Popup result = (DGUS_Data::Popup)((uint8_t*)data_ptr)[1];
  778. if (result != DGUS_Data::Popup::CONFIRMED) {
  779. return;
  780. }
  781. if (!ExtUI::isPrintingPaused()) {
  782. dgus_screen_handler.TriggerFullUpdate();
  783. return;
  784. }
  785. ExtUI::stopPrint();
  786. dgus_screen_handler.TriggerFullUpdate();
  787. }
  788. void DGUSRxHandler::WaitContinue(DGUS_VP &vp, void *data_ptr) {
  789. UNUSED(vp);
  790. UNUSED(data_ptr);
  791. ExtUI::setUserConfirmed();
  792. dgus_screen_handler.TriggerFullUpdate();
  793. }
  794. void DGUSRxHandler::FanSpeed(DGUS_VP &vp, void *data_ptr) {
  795. uint8_t speed = ((uint8_t*)data_ptr)[1];
  796. switch (vp.addr) {
  797. default: return;
  798. case DGUS_Addr::FAN0_Speed:
  799. ExtUI::setTargetFan_percent(speed, ExtUI::FAN0);
  800. break;
  801. }
  802. }
  803. void DGUSRxHandler::Volume(DGUS_VP &vp, void *data_ptr) {
  804. UNUSED(vp);
  805. uint8_t volume = ((uint8_t*)data_ptr)[1];
  806. dgus_display.SetVolume(volume);
  807. dgus_screen_handler.TriggerEEPROMSave();
  808. }
  809. void DGUSRxHandler::Brightness(DGUS_VP &vp, void *data_ptr) {
  810. UNUSED(vp);
  811. uint8_t brightness = ((uint8_t*)data_ptr)[1];
  812. dgus_display.SetBrightness(brightness);
  813. dgus_screen_handler.TriggerEEPROMSave();
  814. }
  815. void DGUSRxHandler::Debug(DGUS_VP &vp, void *data_ptr) {
  816. UNUSED(vp);
  817. UNUSED(data_ptr);
  818. ++dgus_screen_handler.debug_count;
  819. if (dgus_screen_handler.debug_count >= 10) {
  820. dgus_screen_handler.TriggerScreenChange(DGUS_Screen::DEBUG);
  821. }
  822. }
  823. void DGUSRxHandler::StringToExtra(DGUS_VP &vp, void *data_ptr) {
  824. if (!vp.size || !vp.extra) return;
  825. memcpy(vp.extra, data_ptr, vp.size);
  826. }
  827. #endif // DGUS_LCD_UI_RELOADED