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

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