diff --git a/Firmware/Marlin_main.cpp b/Firmware/Marlin_main.cpp index eb703187a4..054aa34482 100644 --- a/Firmware/Marlin_main.cpp +++ b/Firmware/Marlin_main.cpp @@ -1125,6 +1125,7 @@ void setup() if (eeprom_init_default_byte((uint8_t *)EEPROM_MMU_ENABLED, 0)) { MMU2::mmu2.Start(); } + MMU2::mmu2.Status(); SpoolJoin::spooljoin.initSpoolJoinStatus(); //SERIAL_ECHOPAIR("Active sheet before:", static_cast(eeprom_read_byte(&(EEPROM_Sheets_base->active_sheet)))); @@ -8581,14 +8582,17 @@ SERIAL_PROTOCOLPGM("\n\n"); } break; /*! - ### M709 - MMU reset M709: MMU reset - The MK3S cannot not power off the MMU, for that reason the functionality is not supported. + ### M709 - MMU power & reset M709: MMU power & reset + The MK3S cannot not power off the MMU, but we can en- and disable the MMU. + + The new state of the MMU is stored in printer's EEPROM - i.e. if you disable the MMU via M709, it will not be activated after the printer resets. #### Usage - M709 [ X ] + M709 [ S | X ] #### Parameters - - `X` - Reset MMU (0:soft reset | 1:hardware reset) + - `X` - Reset MMU (0:soft reset | 1:hardware reset | 42: erase MMU eeprom) + - `S` - En-/disable the MMU (0:off | 1:on) #### Example @@ -8596,9 +8600,32 @@ SERIAL_PROTOCOLPGM("\n\n"); M709 X1 - toggle the MMU's reset pin (hardware reset) + M709 X42 - erase MMU EEPROM + + M709 S1 - enable MMU + + M709 S0 - disable MMU + + M709 - Serial message if en- or disabled */ case 709: { + if (code_seen('S')) + { + switch (code_value_uint8()) + { + case 0: + eeprom_update_byte((uint8_t *)EEPROM_MMU_ENABLED, false); + MMU2::mmu2.Stop(); + break; + case 1: + eeprom_update_byte((uint8_t *)EEPROM_MMU_ENABLED, true); + MMU2::mmu2.Start(); + break; + default: + break; + } + } if (MMU2::mmu2.Enabled() && code_seen('X')) { switch (code_value_uint8()) @@ -8609,10 +8636,14 @@ SERIAL_PROTOCOLPGM("\n\n"); case 1: MMU2::mmu2.Reset(MMU2::MMU2::ResetPin); break; + case 42: + MMU2::mmu2.Reset(MMU2::MMU2::EraseEEPROM); + break; default: break; } } + MMU2::mmu2.Status(); } break; diff --git a/Firmware/mmu2.cpp b/Firmware/mmu2.cpp index 3797d9e542..fd35e7514b 100644 --- a/Firmware/mmu2.cpp +++ b/Firmware/mmu2.cpp @@ -12,6 +12,9 @@ #include "strlen_cx.h" #include "SpoolJoin.h" +#include "messages.h" +#include "language.h" + #ifdef __AVR__ // As of FW 3.12 we only support building the FW with only one extruder, all the multi-extruder infrastructure will be removed. // Saves at least 800B of code size @@ -52,6 +55,17 @@ MMU2::MMU2() , tmcFailures(0) { } +void MMU2::Status() { + // Useful information to see during bootup and change state + SERIAL_ECHOPGM("MMU is "); + uint8_t status = eeprom_init_default_byte((uint8_t*)EEPROM_MMU_ENABLED, 0); + if (status == 1) { + SERIAL_ECHOLNRPGM(_O(MSG_ON)); + } else { + SERIAL_ECHOLNRPGM(_O(MSG_OFF)); + } +} + void MMU2::Start() { mmu2Serial.begin(MMU_BAUD); diff --git a/Firmware/mmu2.h b/Firmware/mmu2.h index f5eea95b90..0765e82ecf 100644 --- a/Firmware/mmu2.h +++ b/Firmware/mmu2.h @@ -39,6 +39,9 @@ class MMU2 { /// Stops the protocol logic, closes the UART, powers OFF the MMU void Stop(); + /// Serial output of MMU state + void Status(); + inline xState State() const { return state; } inline bool Enabled() const { return State() == xState::Active; } diff --git a/Firmware/mmu2_reporting.cpp b/Firmware/mmu2_reporting.cpp index 3e3d69dc97..45f18034c7 100644 --- a/Firmware/mmu2_reporting.cpp +++ b/Firmware/mmu2_reporting.cpp @@ -347,6 +347,7 @@ void TryLoadUnloadReporter::DumpToSerial(){ /// Disables MMU in EEPROM void DisableMMUInSettings() { eeprom_update_byte((uint8_t *)EEPROM_MMU_ENABLED, false); + mmu2.Status(); } void IncrementLoadFails(){ diff --git a/Firmware/ultralcd.cpp b/Firmware/ultralcd.cpp index 203ab22f87..e6b90a9f4f 100644 --- a/Firmware/ultralcd.cpp +++ b/Firmware/ultralcd.cpp @@ -4093,6 +4093,7 @@ static void mmu_enable_switch() } eeprom_toggle((uint8_t *)EEPROM_MMU_ENABLED); + MMU2::mmu2.Status(); } static void SETTINGS_SILENT_MODE()