0
0
Fork 0
mirror of https://github.com/MarlinFirmware/Marlin.git synced 2025-02-18 07:10:58 +00:00

🔧 Sort out MMU2 / MMU3 (#27455)

Followup to #26635
This commit is contained in:
Scott Lahteine 2024-10-03 19:21:50 -05:00 committed by GitHub
parent 11046b23a9
commit 763cd7c5f2
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
58 changed files with 316 additions and 290 deletions

View file

@ -4405,93 +4405,56 @@
//#define E_MUX0_PIN 40 // Always Required //#define E_MUX0_PIN 40 // Always Required
//#define E_MUX1_PIN 42 // Needed for 3 to 8 inputs //#define E_MUX1_PIN 42 // Needed for 3 to 8 inputs
//#define E_MUX2_PIN 44 // Needed for 5 to 8 inputs //#define E_MUX2_PIN 44 // Needed for 5 to 8 inputs
#elif HAS_PRUSA_MMU2 || HAS_PRUSA_MMU3 #elif HAS_PRUSA_MMU2 || HAS_PRUSA_MMU3
// Common settings for MMU2/MMU2S/MMU3 // Common settings for MMU2/MMU2S/MMU3
// Serial port used for communication with MMU2/MMU2S/MMU3. // Serial port used for communication with MMU2/MMU2S/MMU3.
#define MMU2_SERIAL_PORT 2 #define MMU_SERIAL_PORT 2
#define MMU_BAUD 115200 #define MMU_BAUD 115200
// Use hardware reset for MMU if a pin is defined for it //#define MMU_RST_PIN 23 // Define this pin to use Hardware Reset for MMU2/MMU2S/MMU3
//#define MMU2_RST_PIN 23
//#define MMU_MENUS // Add an LCD menu for MMU2/MMU2S/MMU3
//#define MMU_DEBUG // Write debug info to serial output
// Options pertaining to MMU2 and MMU2S
#if HAS_PRUSA_MMU2 #if HAS_PRUSA_MMU2
// Enable if the MMU2 has 12V stepper motors (MMU2 Firmware 1.0.2 and up) // Enable if the MMU2 has 12V stepper motors (MMU2 Firmware 1.0.2 and up)
//#define MMU2_MODE_12V //#define MMU2_MODE_12V
// Settings for filament load / unload from the LCD menu.
// This is for Průša MK3-style extruders. Customize for your hardware.
#define MMU2_FILAMENTCHANGE_EJECT_FEED 80.0
// G-code to execute when MMU2 F.I.N.D.A. probe detects filament runout // G-code to execute when MMU2 F.I.N.D.A. probe detects filament runout
#define MMU2_FILAMENT_RUNOUT_SCRIPT "M600" #define MMU2_FILAMENT_RUNOUT_SCRIPT "M600"
#endif
// Add an LCD menu for MMU2/MMU2S/MMU3 // MMU2 sequences use mm/min. Not compatible with MMU3, which use mm/sec.
//#define MMU_MENUS #define MMU2_LOAD_TO_NOZZLE_SEQUENCE \
{ 4.4, 871 }, \
{ 10.0, 1393 }, \
{ 4.4, 871 }, \
{ 10.0, 198 }
// Settings for filament load / unload from the LCD menu. #define MMU2_RAMMING_SEQUENCE \
// This is for Průša MK3-style extruders. Customize for your hardware. { 1.0, 1000 }, \
#define MMU2_FILAMENTCHANGE_EJECT_FEED 80.0 { 1.0, 1500 }, \
{ 2.0, 2000 }, \
{ 1.5, 3000 }, \
{ 2.5, 4000 }, \
{ -15.0, 5000 }, \
{ -14.0, 1200 }, \
{ -6.0, 600 }, \
{ 10.0, 700 }, \
{ -10.0, 400 }, \
{ -50.0, 2000 }
#endif // HAS_PRUSA_MMU2
/** /**
* ------------ * Options pertaining to MMU2S devices
* MMU2 / MMU2S * Requires the MK3S extruder with a sensor at the extruder idler, like the MMU2S.
* ------------
* MMU2 sequences use mm/min. Not compatible with MMU3 (see below).
* #define MMU2_LOAD_TO_NOZZLE_SEQUENCE \
* { 4.4, 871 }, \
* { 10.0, 1393 }, \
* { 4.4, 871 }, \
* { 10.0, 198 }
*/
/* #define MMU2_RAMMING_SEQUENCE \
* { 1.0, 1000 }, \
* { 1.0, 1500 }, \
* { 2.0, 2000 }, \
* { 1.5, 3000 }, \
* { 2.5, 4000 }, \
* { -15.0, 5000 }, \
* { -14.0, 1200 }, \
* { -6.0, 600 }, \
* { 10.0, 700 }, \
* { -10.0, 400 }, \
* { -50.0, 2000 }
*/
/**
* ----
* MMU3
* ----
* These values are compatible with MMU3 as they are defined in mm/s
*/
#define MMU2_EXTRUDER_PTFE_LENGTH 42.3 // (mm)
#define MMU2_EXTRUDER_HEATBREAK_LENGTH 17.7 // (mm)
#define MMU2_LOAD_TO_NOZZLE_SEQUENCE \
{ MMU2_EXTRUDER_PTFE_LENGTH, MMM_TO_MMS(810) }, /* (13.5 mm/s) Fast load ahead of heatbreak */ \
{ MMU2_EXTRUDER_HEATBREAK_LENGTH, MMM_TO_MMS(198) } // ( 3.3 mm/s) Slow load after heatbreak
#define MMU2_RAMMING_SEQUENCE \
{ 0.2816, MMM_TO_MMS(1339.0) }, \
{ 0.3051, MMM_TO_MMS(1451.0) }, \
{ 0.3453, MMM_TO_MMS(1642.0) }, \
{ 0.3990, MMM_TO_MMS(1897.0) }, \
{ 0.4761, MMM_TO_MMS(2264.0) }, \
{ 0.5767, MMM_TO_MMS(2742.0) }, \
{ 0.5691, MMM_TO_MMS(3220.0) }, \
{ 0.1081, MMM_TO_MMS(3220.0) }, \
{ 0.7644, MMM_TO_MMS(3635.0) }, \
{ 0.8248, MMM_TO_MMS(3921.0) }, \
{ 0.8483, MMM_TO_MMS(4033.0) }, \
{ -15.0, MMM_TO_MMS(6000.0) }, \
{ -24.5, MMM_TO_MMS(1200.0) }, \
{ -7.0, MMM_TO_MMS( 600.0) }, \
{ -3.5, MMM_TO_MMS( 360.0) }, \
{ 20.0, MMM_TO_MMS( 454.0) }, \
{ -20.0, MMM_TO_MMS( 303.0) }, \
{ -35.0, MMM_TO_MMS(2000.0) }
/**
* Using a sensor like the MMU2S
* This mode requires a MK3S extruder with a sensor at the extruder idler, like the MMU2S.
* See https://help.prusa3d.com/guide/3b-mk3s-mk2-5s-extruder-upgrade_41560#42048, step 11 * See https://help.prusa3d.com/guide/3b-mk3s-mk2-5s-extruder-upgrade_41560#42048, step 11
*/ */
#if HAS_PRUSA_MMU2S #if HAS_PRUSA_MMU2S
@ -4532,14 +4495,9 @@
// MMU3 settings // MMU3 settings
#define MMU2_MAX_RETRIES 3 // Number of retries (total time = timeout*retries) #define MMU3_HAS_CUTTER // Enable cutter related functionality
// Nominal distance from the extruder gear to the nozzle tip is 87mm #define MMU3_MAX_RETRIES 3 // Number of retries (total time = timeout*retries)
// However, some slipping may occur and we need separate distances for
// LoadToNozzle and ToolChange.
// - +5mm seemed good for LoadToNozzle,
// - but too much (made blobs) for a ToolChange
#define MMU2_LOAD_TO_NOZZLE_LENGTH 87.0 + 5.0
// As discussed with our PrusaSlicer profile specialist // As discussed with our PrusaSlicer profile specialist
// - ToolChange shall not try to push filament into the very tip of the nozzle // - ToolChange shall not try to push filament into the very tip of the nozzle
@ -4548,28 +4506,26 @@
// Beware - this value is used to initialize the MMU logic layer - it will be sent to the MMU upon line up (written into its 8bit register 0x0b) // Beware - this value is used to initialize the MMU logic layer - it will be sent to the MMU upon line up (written into its 8bit register 0x0b)
// However - in the G-code we can get a request to set the extra load distance at runtime to something else (M708 A0xb Xsomething). // However - in the G-code we can get a request to set the extra load distance at runtime to something else (M708 A0xb Xsomething).
// The printer intercepts such a call and sets its extra load distance to match the new value as well. // The printer intercepts such a call and sets its extra load distance to match the new value as well.
#define MMU2_FILAMENT_SENSOR_POSITION 0 // (mm) #define MMU3_FILAMENT_SENSOR_E_POSITION 0 // (mm)
#define MMU2_LOAD_DISTANCE_PAST_GEARS 5 // (mm) #define _MMU3_LOAD_DISTANCE_PAST_GEARS 5 // (mm)
#define MMU2_TOOL_CHANGE_LOAD_LENGTH MMU2_FILAMENT_SENSOR_POSITION + MMU2_LOAD_DISTANCE_PAST_GEARS // (mm) #define MMU3_TOOL_CHANGE_LOAD_LENGTH (MMU3_FILAMENT_SENSOR_E_POSITION + _MMU3_LOAD_DISTANCE_PAST_GEARS) // (mm)
#define MMU2_LOAD_TO_NOZZLE_FEED_RATE 20.0 // (mm/s) #define MMU3_LOAD_TO_NOZZLE_FEED_RATE 20.0 // (mm/s)
#define MMU2_UNLOAD_TO_FINDA_FEED_RATE 120.0 // (mm/s)
#define MMU2_VERIFY_LOAD_TO_NOZZLE_FEED_RATE 50.0 // (mm/s) #define MMU3_VERIFY_LOAD_TO_NOZZLE_FEED_RATE 50.0 // (mm/s)
#define MMU2_VERIFY_LOAD_TO_NOZZLE_TWEAK -5.0 // (mm) Amount to adjust the length for verifying load-to-nozzle #define _MMU3_VERIFY_LOAD_TO_NOZZLE_TWEAK -5.0 // (mm) Amount to adjust the length for verifying load-to-nozzle
// The first thing the MMU does is initialize its axis. // The first thing the MMU does is initialize its axis.
// Meanwhile the E-motor will unload 20mm of filament in about 1 second. // Meanwhile the E-motor will unload 20mm of filament in about 1 second.
#define MMU2_RETRY_UNLOAD_TO_FINDA_LENGTH 80.0 // (mm) #define MMU3_RETRY_UNLOAD_TO_FINDA_LENGTH 80.0 // (mm)
#define MMU2_RETRY_UNLOAD_TO_FINDA_FEED_RATE 80.0 // (mm/s) #define MMU3_RETRY_UNLOAD_TO_FINDA_FEED_RATE 80.0 // (mm/s)
// After loading a new filament, the printer will extrude this length of filament // After loading a new filament, the printer will extrude this length of filament
// then retract to the original position. This is used to check if the filament sensor // then retract to the original position. This is used to check if the filament sensor
// reading flickers or filament is jammed. // reading flickers or filament is jammed.
#define MMU2_CHECK_FILAMENT_PRESENCE_EXTRUSION_LENGTH (MMU2_EXTRUDER_PTFE_LENGTH + MMU2_EXTRUDER_HEATBREAK_LENGTH + MMU2_VERIFY_LOAD_TO_NOZZLE_TWEAK + MMU2_FILAMENT_SENSOR_POSITION) // (mm) #define _MMU_EXTRUDER_PTFE_LENGTH 42.3 // (mm)
#define _MMU_EXTRUDER_HEATBREAK_LENGTH 17.7 // (mm)
#define MMU_HAS_CUTTER // Enable cutter related functionalities #define MMU3_CHECK_FILAMENT_PRESENCE_EXTRUSION_LENGTH (MMU3_FILAMENT_SENSOR_E_POSITION + _MMU_EXTRUDER_PTFE_LENGTH + _MMU_EXTRUDER_HEATBREAK_LENGTH + _MMU3_VERIFY_LOAD_TO_NOZZLE_TWEAK) // (mm)
//#define MMU_FORCE_STEALTH_MODE // Force stealth mode and disable menu item
/** /**
* SpoolJoin Consumes All Filament -- EXPERIMENTAL * SpoolJoin Consumes All Filament -- EXPERIMENTAL
@ -4587,12 +4543,37 @@
* sensor is triggered through the gears) and the end of the PTFE tube and * sensor is triggered through the gears) and the end of the PTFE tube and
* can cause filament load issues. * can cause filament load issues.
*/ */
//#define MMU_SPOOL_JOIN_CONSUMES_ALL_FILAMENT //#define MMU3_SPOOL_JOIN_CONSUMES_ALL_FILAMENT
#else // MMU3 sequences use mm/sec. Not compatible with MMU2 which use mm/min.
#define MMU3_LOAD_TO_NOZZLE_SEQUENCE \
{ _MMU_EXTRUDER_PTFE_LENGTH, MMM_TO_MMS(810) }, /* (13.5 mm/s) Fast load ahead of heatbreak */ \
{ _MMU_EXTRUDER_HEATBREAK_LENGTH, MMM_TO_MMS(198) } /* ( 3.3 mm/s) Slow load after heatbreak */
#define MMU3_RAMMING_SEQUENCE \
{ 0.2816, MMM_TO_MMS(1339.0) }, \
{ 0.3051, MMM_TO_MMS(1451.0) }, \
{ 0.3453, MMM_TO_MMS(1642.0) }, \
{ 0.3990, MMM_TO_MMS(1897.0) }, \
{ 0.4761, MMM_TO_MMS(2264.0) }, \
{ 0.5767, MMM_TO_MMS(2742.0) }, \
{ 0.5691, MMM_TO_MMS(3220.0) }, \
{ 0.1081, MMM_TO_MMS(3220.0) }, \
{ 0.7644, MMM_TO_MMS(3635.0) }, \
{ 0.8248, MMM_TO_MMS(3921.0) }, \
{ 0.8483, MMM_TO_MMS(4033.0) }, \
{ -15.0, MMM_TO_MMS(6000.0) }, \
{ -24.5, MMM_TO_MMS(1200.0) }, \
{ -7.0, MMM_TO_MMS( 600.0) }, \
{ -3.5, MMM_TO_MMS( 360.0) }, \
{ 20.0, MMM_TO_MMS( 454.0) }, \
{ -20.0, MMM_TO_MMS( 303.0) }, \
{ -35.0, MMM_TO_MMS(2000.0) }
#else // MMU2 (not MMU2S)
/** /**
* MMU1 Extruder Sensor * MMU2 Extruder Sensor
* *
* Support for a Průša (or other) IR Sensor to detect filament near the extruder * Support for a Průša (or other) IR Sensor to detect filament near the extruder
* and make loading more reliable. Suitable for an extruder equipped with a filament * and make loading more reliable. Suitable for an extruder equipped with a filament
@ -4602,15 +4583,13 @@
* move up to the gears. If no filament is detected, the MMU2 can make some more attempts. * move up to the gears. If no filament is detected, the MMU2 can make some more attempts.
* If all attempts fail, a filament runout will be triggered. * If all attempts fail, a filament runout will be triggered.
*/ */
//#define MMU_EXTRUDER_SENSOR //#define MMU2_EXTRUDER_SENSOR
#if ENABLED(MMU_EXTRUDER_SENSOR) #if ENABLED(MMU2_EXTRUDER_SENSOR)
#define MMU_LOADING_ATTEMPTS_NR 5 // max. number of attempts to load filament if first load fail #define MMU2_LOADING_ATTEMPTS_NR 5 // Number of times to try loading filament before failure
#endif #endif
#endif #endif
//#define MMU2_DEBUG // Write debug info to serial output
#endif // HAS_PRUSA_MMU2 || HAS_PRUSA_MMU3 #endif // HAS_PRUSA_MMU2 || HAS_PRUSA_MMU3
/** /**

View file

@ -129,11 +129,11 @@ typedef Servo hal_servo_t;
#endif #endif
#endif #endif
#ifdef MMU2_SERIAL_PORT #ifdef MMU_SERIAL_PORT
#if !WITHIN(MMU2_SERIAL_PORT, 0, 3) #if !WITHIN(MMU_SERIAL_PORT, 0, 3)
#error "MMU2_SERIAL_PORT must be from 0 to 3" #error "MMU_SERIAL_PORT must be from 0 to 3"
#endif #endif
#define MMU2_SERIAL mmuSerial #define MMU_SERIAL mmuSerial
#endif #endif
#ifdef LCD_SERIAL_PORT #ifdef LCD_SERIAL_PORT

View file

@ -601,20 +601,20 @@ MSerialT1 customizedSerial1(MSerialT1::HasEmergencyParser);
#endif // SERIAL_PORT_3 #endif // SERIAL_PORT_3
#ifdef MMU2_SERIAL_PORT #ifdef MMU_SERIAL_PORT
ISR(SERIAL_REGNAME(USART, MMU2_SERIAL_PORT, _RX_vect)) { ISR(SERIAL_REGNAME(USART, MMU_SERIAL_PORT, _RX_vect)) {
MarlinSerial<MMU2SerialCfg<MMU2_SERIAL_PORT>>::store_rxd_char(); MarlinSerial<MMU2SerialCfg<MMU_SERIAL_PORT>>::store_rxd_char();
} }
ISR(SERIAL_REGNAME(USART, MMU2_SERIAL_PORT, _UDRE_vect)) { ISR(SERIAL_REGNAME(USART, MMU_SERIAL_PORT, _UDRE_vect)) {
MarlinSerial<MMU2SerialCfg<MMU2_SERIAL_PORT>>::_tx_udr_empty_irq(); MarlinSerial<MMU2SerialCfg<MMU_SERIAL_PORT>>::_tx_udr_empty_irq();
} }
template class MarlinSerial< MMU2SerialCfg<MMU2_SERIAL_PORT> >; template class MarlinSerial< MMU2SerialCfg<MMU_SERIAL_PORT> >;
MSerialMMU2 mmuSerial(MSerialMMU2::HasEmergencyParser); MSerialMMU2 mmuSerial(MSerialMMU2::HasEmergencyParser);
#endif // MMU2_SERIAL_PORT #endif // MMU_SERIAL_PORT
#ifdef LCD_SERIAL_PORT #ifdef LCD_SERIAL_PORT

View file

@ -246,7 +246,7 @@
#endif // !USBCON #endif // !USBCON
#ifdef MMU2_SERIAL_PORT #ifdef MMU_SERIAL_PORT
template <uint8_t serial> template <uint8_t serial>
struct MMU2SerialCfg { struct MMU2SerialCfg {
static constexpr int PORT = serial; static constexpr int PORT = serial;
@ -260,7 +260,7 @@
static constexpr bool RX_OVERRUNS = false; static constexpr bool RX_OVERRUNS = false;
}; };
typedef Serial1Class< MarlinSerial< MMU2SerialCfg<MMU2_SERIAL_PORT> > > MSerialMMU2; typedef Serial1Class< MarlinSerial< MMU2SerialCfg<MMU_SERIAL_PORT> > > MSerialMMU2;
extern MSerialMMU2 mmuSerial; extern MSerialMMU2 mmuSerial;
#endif #endif

View file

@ -81,11 +81,11 @@ extern DefaultSerial4 MSerial3;
#endif #endif
#endif #endif
#ifdef MMU2_SERIAL_PORT #ifdef MMU_SERIAL_PORT
#if WITHIN(MMU2_SERIAL_PORT, 0, 3) #if WITHIN(MMU_SERIAL_PORT, 0, 3)
#define MMU2_SERIAL MSERIAL(MMU2_SERIAL_PORT) #define MMU_SERIAL MSERIAL(MMU_SERIAL_PORT)
#else #else
#error "MMU2_SERIAL_PORT must be from 0 to 3." #error "MMU_SERIAL_PORT must be from 0 to 3."
#endif #endif
#endif #endif

View file

@ -82,13 +82,13 @@ extern DefaultSerial1 USBSerial;
#endif #endif
#endif #endif
#ifdef MMU2_SERIAL_PORT #ifdef MMU_SERIAL_PORT
#if MMU2_SERIAL_PORT == -1 #if MMU_SERIAL_PORT == -1
#define MMU2_SERIAL USBSerial #define MMU_SERIAL USBSerial
#elif WITHIN(MMU2_SERIAL_PORT, 0, 3) #elif WITHIN(MMU_SERIAL_PORT, 0, 3)
#define MMU2_SERIAL MSERIAL(MMU2_SERIAL_PORT) #define MMU_SERIAL MSERIAL(MMU_SERIAL_PORT)
#else #else
#error "MMU2_SERIAL_PORT must be from 0 to 3. You can also use -1 if the board supports Native USB." #error "MMU_SERIAL_PORT must be from 0 to 3. You can also use -1 if the board supports Native USB."
#endif #endif
#endif #endif

View file

@ -87,11 +87,11 @@ extern MSerialT serial_stream_3;
#endif #endif
#endif #endif
#ifdef MMU2_SERIAL_PORT #ifdef MMU_SERIAL_PORT
#if WITHIN(MMU2_SERIAL_PORT, 0, 3) #if WITHIN(MMU_SERIAL_PORT, 0, 3)
#define MMU2_SERIAL MSERIAL(MMU2_SERIAL_PORT) #define MMU_SERIAL MSERIAL(MMU_SERIAL_PORT)
#else #else
#error "MMU2_SERIAL_PORT must be from 0 to 3. Please update your configuration." #error "MMU_SERIAL_PORT must be from 0 to 3. Please update your configuration."
#endif #endif
#endif #endif

View file

@ -69,13 +69,13 @@ extern DefaultSerial3 MSerial1;
#endif #endif
#endif #endif
#ifdef MMU2_SERIAL_PORT #ifdef MMU_SERIAL_PORT
#if WITHIN(MMU2_SERIAL_PORT, 0, 1) #if WITHIN(MMU_SERIAL_PORT, 0, 1)
#define MMU2_SERIAL MSERIAL(SERIAL_PORT) #define MMU_SERIAL MSERIAL(SERIAL_PORT)
#elif MMU2_SERIAL_PORT == -1 #elif MMU_SERIAL_PORT == -1
#define MMU2_SERIAL MSerialUSB #define MMU_SERIAL MSerialUSB
#else #else
#error "MMU2_SERIAL_PORT must be -1 (Native USB only)." #error "MMU_SERIAL_PORT must be -1 (Native USB only)."
#endif #endif
#endif #endif

View file

@ -79,13 +79,13 @@
#endif #endif
#endif #endif
#ifdef MMU2_SERIAL_PORT #ifdef MMU_SERIAL_PORT
#if MMU2_SERIAL_PORT == -1 #if MMU_SERIAL_PORT == -1
#define MMU2_SERIAL MSerial0 #define MMU_SERIAL MSerial0
#elif WITHIN(MMU2_SERIAL_PORT, 0, 3) #elif WITHIN(MMU_SERIAL_PORT, 0, 3)
#define MMU2_SERIAL MSERIAL(MMU2_SERIAL_PORT) #define MMU_SERIAL MSERIAL(MMU_SERIAL_PORT)
#else #else
#error "MMU2_SERIAL_PORT must be from 0 to 3. You can also use -1 if the board supports Native USB." #error "MMU_SERIAL_PORT must be from 0 to 3. You can also use -1 if the board supports Native USB."
#endif #endif
#endif #endif

View file

@ -90,15 +90,15 @@
#endif #endif
#endif #endif
#ifdef MMU2_SERIAL_PORT #ifdef MMU_SERIAL_PORT
#if WITHIN(MMU2_SERIAL_PORT, 1, 9) #if WITHIN(MMU_SERIAL_PORT, 1, 9)
#define MMU2_SERIAL MSERIAL(MMU2_SERIAL_PORT) #define MMU_SERIAL MSERIAL(MMU_SERIAL_PORT)
#elif !defined(USBCON) #elif !defined(USBCON)
#error "MMU2_SERIAL_PORT must be from 1 to 9." #error "MMU_SERIAL_PORT must be from 1 to 9."
#elif MMU2_SERIAL_PORT == -1 #elif MMU_SERIAL_PORT == -1
#define MMU2_SERIAL MSerialUSB #define MMU_SERIAL MSerialUSB
#else #else
#error "MMU2_SERIAL_PORT must be from 1 to 9, or -1 for Native USB." #error "MMU_SERIAL_PORT must be from 1 to 9, or -1 for Native USB."
#endif #endif
#endif #endif

View file

@ -118,14 +118,14 @@
#endif #endif
#endif #endif
#ifdef MMU2_SERIAL_PORT #ifdef MMU_SERIAL_PORT
#if MMU2_SERIAL_PORT == -1 #if MMU_SERIAL_PORT == -1
#define MMU2_SERIAL UsbSerial #define MMU_SERIAL UsbSerial
#elif WITHIN(MMU2_SERIAL_PORT, 1, NUM_UARTS) #elif WITHIN(MMU_SERIAL_PORT, 1, NUM_UARTS)
#define MMU2_SERIAL MSERIAL(MMU2_SERIAL_PORT) #define MMU_SERIAL MSERIAL(MMU_SERIAL_PORT)
#else #else
#define MMU2_SERIAL MSERIAL(1) // dummy port #define MMU_SERIAL MSERIAL(1) // dummy port
static_assert(false, "MMU2_SERIAL_PORT must be from 1 to " STRINGIFY(NUM_UARTS) ". You can also use -1 if the board supports Native USB.") static_assert(false, "MMU_SERIAL_PORT must be from 1 to " STRINGIFY(NUM_UARTS) ". You can also use -1 if the board supports Native USB.")
#endif #endif
#endif #endif

View file

@ -232,8 +232,8 @@
#endif #endif
#if HAS_PRUSA_MMU3 #if HAS_PRUSA_MMU3
#include "feature/mmu3/mmu2.h" #include "feature/mmu3/mmu3.h"
#include "feature/mmu3/mmu2_reporting.h" #include "feature/mmu3/mmu3_reporting.h"
#include "feature/mmu3/SpoolJoin.h" #include "feature/mmu3/SpoolJoin.h"
#elif HAS_PRUSA_MMU2 #elif HAS_PRUSA_MMU2
#include "feature/mmu/mmu2.h" #include "feature/mmu/mmu2.h"

View file

@ -744,7 +744,6 @@ void Max7219::idle_tasks() {
#endif #endif
#ifdef MAX7219_DEBUG_PLANNER_QUEUE #ifdef MAX7219_DEBUG_PLANNER_QUEUE
static int16_t last_depth = 0;
const int16_t current_depth = BLOCK_MOD(head - tail + (BLOCK_BUFFER_SIZE)) & 0xF; const int16_t current_depth = BLOCK_MOD(head - tail + (BLOCK_BUFFER_SIZE)) & 0xF;
if (current_depth != last_depth) { if (current_depth != last_depth) {
quantity16(MAX7219_DEBUG_PLANNER_QUEUE, last_depth, current_depth, &row_change_mask); quantity16(MAX7219_DEBUG_PLANNER_QUEUE, last_depth, current_depth, &row_change_mask);

View file

@ -24,6 +24,10 @@
#if HAS_PRUSA_MMU2 #if HAS_PRUSA_MMU2
/**
* mmu2.cpp - Support for Průša MMU2 and MMU2S
*/
#include "mmu2.h" #include "mmu2.h"
#include "../../lcd/menu/menu_mmu2.h" #include "../../lcd/menu/menu_mmu2.h"
@ -46,7 +50,7 @@ MMU2 mmu2;
#include "../../lcd/extui/ui_api.h" #include "../../lcd/extui/ui_api.h"
#endif #endif
#define DEBUG_OUT ENABLED(MMU2_DEBUG) #define DEBUG_OUT ENABLED(MMU_DEBUG)
#include "../../core/debug_out.h" #include "../../core/debug_out.h"
#define MMU_TODELAY 100 #define MMU_TODELAY 100
@ -57,7 +61,7 @@ MMU2 mmu2;
#define MMU2_SEND(S) tx_str(F(S "\n")) #define MMU2_SEND(S) tx_str(F(S "\n"))
#define MMU2_RECV(S) rx_str(F(S "\n")) #define MMU2_RECV(S) rx_str(F(S "\n"))
#if ENABLED(MMU_EXTRUDER_SENSOR) #if ENABLED(MMU2_EXTRUDER_SENSOR)
uint8_t mmu_idl_sens = 0; uint8_t mmu_idl_sens = 0;
static bool mmu_loading_flag = false; static bool mmu_loading_flag = false;
#endif #endif
@ -106,12 +110,12 @@ void MMU2::init() {
set_runout_valid(false); set_runout_valid(false);
#if PIN_EXISTS(MMU2_RST) #if PIN_EXISTS(MMU_RST)
WRITE(MMU2_RST_PIN, HIGH); WRITE(MMU_RST_PIN, HIGH);
SET_OUTPUT(MMU2_RST_PIN); SET_OUTPUT(MMU_RST_PIN);
#endif #endif
MMU2_SERIAL.begin(MMU_BAUD); MMU_SERIAL.begin(MMU_BAUD);
extruder = MMU2_NO_TOOL; extruder = MMU2_NO_TOOL;
safe_delay(10); safe_delay(10);
@ -123,10 +127,10 @@ void MMU2::init() {
void MMU2::reset() { void MMU2::reset() {
DEBUG_ECHOLNPGM("MMU <= reset"); DEBUG_ECHOLNPGM("MMU <= reset");
#if PIN_EXISTS(MMU2_RST) #if PIN_EXISTS(MMU_RST)
WRITE(MMU2_RST_PIN, LOW); WRITE(MMU_RST_PIN, LOW);
safe_delay(20); safe_delay(20);
WRITE(MMU2_RST_PIN, HIGH); WRITE(MMU_RST_PIN, HIGH);
#else #else
MMU2_SEND("X0"); // Send soft reset MMU2_SEND("X0"); // Send soft reset
#endif #endif
@ -134,7 +138,7 @@ void MMU2::reset() {
int8_t MMU2::get_current_tool() { return extruder == MMU2_NO_TOOL ? -1 : extruder; } int8_t MMU2::get_current_tool() { return extruder == MMU2_NO_TOOL ? -1 : extruder; }
#if ANY(HAS_PRUSA_MMU2S, MMU_EXTRUDER_SENSOR) #if ANY(HAS_PRUSA_MMU2S, MMU2_EXTRUDER_SENSOR)
#define FILAMENT_PRESENT() (READ(FIL_RUNOUT1_PIN) != FIL_RUNOUT1_STATE) #define FILAMENT_PRESENT() (READ(FIL_RUNOUT1_PIN) != FIL_RUNOUT1_STATE)
#else #else
#define FILAMENT_PRESENT() true #define FILAMENT_PRESENT() true
@ -226,7 +230,7 @@ void MMU2::mmu_loop() {
const int filament = cmd - MMU_CMD_T0; const int filament = cmd - MMU_CMD_T0;
DEBUG_ECHOLNPGM("MMU <= T", filament); DEBUG_ECHOLNPGM("MMU <= T", filament);
tx_printf(F("T%d\n"), filament); tx_printf(F("T%d\n"), filament);
TERN_(MMU_EXTRUDER_SENSOR, mmu_idl_sens = 1); // enable idler sensor, if any TERN_(MMU2_EXTRUDER_SENSOR, mmu_idl_sens = 1); // enable idler sensor, if any
state = 3; // wait for response state = 3; // wait for response
} }
else if (WITHIN(cmd, MMU_CMD_L0, MMU_CMD_L0 + EXTRUDERS - 1)) { else if (WITHIN(cmd, MMU_CMD_L0, MMU_CMD_L0 + EXTRUDERS - 1)) {
@ -299,7 +303,7 @@ void MMU2::mmu_loop() {
break; break;
case 3: // response to mmu commands case 3: // response to mmu commands
#if ENABLED(MMU_EXTRUDER_SENSOR) #if ENABLED(MMU2_EXTRUDER_SENSOR)
if (mmu_idl_sens) { if (mmu_idl_sens) {
if (FILAMENT_PRESENT() && mmu_loading_flag) { if (FILAMENT_PRESENT() && mmu_loading_flag) {
DEBUG_ECHOLNPGM("MMU <= 'A'"); DEBUG_ECHOLNPGM("MMU <= 'A'");
@ -361,8 +365,8 @@ bool MMU2::rx_str(FSTR_P fstr) {
uint8_t i = strlen(rx_buffer); uint8_t i = strlen(rx_buffer);
while (MMU2_SERIAL.available()) { while (MMU_SERIAL.available()) {
rx_buffer[i++] = MMU2_SERIAL.read(); rx_buffer[i++] = MMU_SERIAL.read();
if (i == sizeof(rx_buffer) - 1) { if (i == sizeof(rx_buffer) - 1) {
DEBUG_ECHOLNPGM("rx buffer overrun"); DEBUG_ECHOLNPGM("rx buffer overrun");
@ -393,7 +397,7 @@ bool MMU2::rx_str(FSTR_P fstr) {
void MMU2::tx_str(FSTR_P fstr) { void MMU2::tx_str(FSTR_P fstr) {
clear_rx_buffer(); clear_rx_buffer();
PGM_P pstr = FTOP(fstr); PGM_P pstr = FTOP(fstr);
while (const char c = pgm_read_byte(pstr)) { MMU2_SERIAL.write(c); pstr++; } while (const char c = pgm_read_byte(pstr)) { MMU_SERIAL.write(c); pstr++; }
prev_request = millis(); prev_request = millis();
} }
@ -403,7 +407,7 @@ void MMU2::tx_str(FSTR_P fstr) {
void MMU2::tx_printf(FSTR_P format, int argument = -1) { void MMU2::tx_printf(FSTR_P format, int argument = -1) {
clear_rx_buffer(); clear_rx_buffer();
const uint8_t len = sprintf_P(tx_buffer, FTOP(format), argument); const uint8_t len = sprintf_P(tx_buffer, FTOP(format), argument);
for (uint8_t i = 0; i < len; ++i) MMU2_SERIAL.write(tx_buffer[i]); for (uint8_t i = 0; i < len; ++i) MMU_SERIAL.write(tx_buffer[i]);
prev_request = millis(); prev_request = millis();
} }
@ -413,7 +417,7 @@ void MMU2::tx_printf(FSTR_P format, int argument = -1) {
void MMU2::tx_printf(FSTR_P format, int argument1, int argument2) { void MMU2::tx_printf(FSTR_P format, int argument1, int argument2) {
clear_rx_buffer(); clear_rx_buffer();
const uint8_t len = sprintf_P(tx_buffer, FTOP(format), argument1, argument2); const uint8_t len = sprintf_P(tx_buffer, FTOP(format), argument1, argument2);
for (uint8_t i = 0; i < len; ++i) MMU2_SERIAL.write(tx_buffer[i]); for (uint8_t i = 0; i < len; ++i) MMU_SERIAL.write(tx_buffer[i]);
prev_request = millis(); prev_request = millis();
} }
@ -421,7 +425,7 @@ void MMU2::tx_printf(FSTR_P format, int argument1, int argument2) {
* Empty the rx buffer * Empty the rx buffer
*/ */
void MMU2::clear_rx_buffer() { void MMU2::clear_rx_buffer() {
while (MMU2_SERIAL.available()) MMU2_SERIAL.read(); while (MMU_SERIAL.available()) MMU_SERIAL.read();
rx_buffer[0] = '\0'; rx_buffer[0] = '\0';
} }
@ -563,7 +567,7 @@ inline void beep_bad_cmd() { BUZZ(400, 40); }
set_runout_valid(true); set_runout_valid(true);
} }
#elif ENABLED(MMU_EXTRUDER_SENSOR) #elif ENABLED(MMU2_EXTRUDER_SENSOR)
/** /**
* Handle tool change * Handle tool change
@ -656,7 +660,7 @@ inline void beep_bad_cmd() { BUZZ(400, 40); }
void MMU2::mmu_continue_loading() { void MMU2::mmu_continue_loading() {
// Try to load the filament a limited number of times // Try to load the filament a limited number of times
bool fil_present = 0; bool fil_present = 0;
for (uint8_t i = 0; i < MMU_LOADING_ATTEMPTS_NR; i++) { for (uint8_t i = 0; i < MMU2_LOADING_ATTEMPTS_NR; i++) {
DEBUG_ECHOLNPGM("Load attempt #", i + 1); DEBUG_ECHOLNPGM("Load attempt #", i + 1);
// Done as soon as filament is present // Done as soon as filament is present
@ -688,7 +692,7 @@ inline void beep_bad_cmd() { BUZZ(400, 40); }
mmu_idl_sens = 0; mmu_idl_sens = 0;
} }
#else // !HAS_PRUSA_MMU2S && !MMU_EXTRUDER_SENSOR #else // !HAS_PRUSA_MMU2S && !MMU2_EXTRUDER_SENSOR
/** /**
* Handle tool change * Handle tool change

View file

@ -21,6 +21,10 @@
*/ */
#pragma once #pragma once
/**
* mmu2.h - Support for Průša MMU2 and MMU2S
*/
#include "../../inc/MarlinConfig.h" #include "../../inc/MarlinConfig.h"
#if HAS_FILAMENT_SENSOR #if HAS_FILAMENT_SENSOR
@ -85,7 +89,7 @@ private:
FORCE_INLINE static bool load_to_gears() { return true; } FORCE_INLINE static bool load_to_gears() { return true; }
#endif #endif
#if ENABLED(MMU_EXTRUDER_SENSOR) #if ENABLED(MMU2_EXTRUDER_SENSOR)
#define MMU_LOAD_FEEDRATE 19.02f // (mm/s) #define MMU_LOAD_FEEDRATE 19.02f // (mm/s)
static void mmu_continue_loading(); static void mmu_continue_loading();
#endif #endif

View file

@ -28,15 +28,15 @@
#if HAS_PRUSA_MMU3 #if HAS_PRUSA_MMU3
#include "mmu2.h" #include "mmu3.h"
#include "mmu2_error_converter.h" #include "mmu3_error_converter.h"
#include "mmu2_fsensor.h" #include "mmu3_fsensor.h"
#include "mmu2_log.h" #include "mmu3_log.h"
#include "mmu2_marlin.h" #include "mmu3_marlin.h"
#include "mmu2_marlin_macros.h" #include "mmu3_marlin_macros.h"
#include "mmu2_power.h" #include "mmu3_power.h"
#include "mmu2_progress_converter.h" #include "mmu3_progress_converter.h"
#include "mmu2_reporting.h" #include "mmu3_reporting.h"
#include "strlen_cx.h" #include "strlen_cx.h"
#include "SpoolJoin.h" #include "SpoolJoin.h"
@ -91,7 +91,7 @@ namespace MMU3 {
int MMU3::mmu_hw_enabled_addr; // Initialized by settings.load int MMU3::mmu_hw_enabled_addr; // Initialized by settings.load
MMU3::MMU3() MMU3::MMU3()
: logic(MMU2_TOOL_CHANGE_LOAD_LENGTH, MMU2_LOAD_TO_NOZZLE_FEED_RATE) : logic(MMU3_TOOL_CHANGE_LOAD_LENGTH, MMU3_LOAD_TO_NOZZLE_FEED_RATE)
, extruder(MMU2_NO_TOOL) , extruder(MMU2_NO_TOOL)
, tool_change_extruder(MMU2_NO_TOOL) , tool_change_extruder(MMU2_NO_TOOL)
, resume_position() , resume_position()
@ -121,10 +121,10 @@ namespace MMU3 {
settings.save(); settings.save();
#endif #endif
MMU2_SERIAL.begin(MMU_BAUD); MMU_SERIAL.begin(MMU_BAUD);
powerOn(); powerOn();
MMU2_SERIAL.flush(); // Make sure the UART buffer is clear before starting communication MMU_SERIAL.flush(); // Make sure the UART buffer is clear before starting communication
setCurrentTool(MMU2_NO_TOOL); setCurrentTool(MMU2_NO_TOOL);
_state = xState::Connecting; _state = xState::Connecting;
@ -153,7 +153,7 @@ namespace MMU3 {
_state = xState::Stopped; _state = xState::Stopped;
logic.stop(); logic.stop();
MMU2_SERIAL.end(); MMU_SERIAL.end();
} }
void MMU3::tune() { void MMU3::tune() {
@ -279,14 +279,14 @@ namespace MMU3 {
&& TERN1(HAS_LEVELING, planner.leveling_active) && TERN1(HAS_LEVELING, planner.leveling_active)
&& xy_are_trusted() && xy_are_trusted()
&& e_active() && e_active()
#if ENABLED(MMU_SPOOL_JOIN_CONSUMES_ALL_FILAMENT) #if ENABLED(MMU3_SPOOL_JOIN_CONSUMES_ALL_FILAMENT)
&& runout.enabled // to prevent M600 to be triggered during M600 AUTO && runout.enabled // to prevent M600 to be triggered during M600 AUTO
&& !FILAMENT_PRESENT() // so the filament is totally consumed && !FILAMENT_PRESENT() // so the filament is totally consumed
#endif #endif
) { ) {
SERIAL_ECHOLN_P("FINDA filament runout!"); SERIAL_ECHOLN_P("FINDA filament runout!");
if (spooljoin.isEnabled() && get_current_tool() != (uint8_t)FILAMENT_UNKNOWN) { // Can't auto if F=? if (spooljoin.isEnabled() && get_current_tool() != (uint8_t)FILAMENT_UNKNOWN) { // Can't auto if F=?
#if ENABLED(MMU_SPOOL_JOIN_CONSUMES_ALL_FILAMENT) #if ENABLED(MMU3_SPOOL_JOIN_CONSUMES_ALL_FILAMENT)
// set the current tool to FILAMENT_UNKNOWN so that we don't try to unload it // set the current tool to FILAMENT_UNKNOWN so that we don't try to unload it
extruder = MMU2_NO_TOOL; extruder = MMU2_NO_TOOL;
// disable the filament runout sensor (this is going to be re-enabled after the filament is loaded) // disable the filament runout sensor (this is going to be re-enabled after the filament is loaded)
@ -294,7 +294,7 @@ namespace MMU3 {
runout.filament_ran_out = false; // trying to disable the purge more / continue message runout.filament_ran_out = false; // trying to disable the purge more / continue message
runout.enabled = false; runout.enabled = false;
#endif #endif
queue.enqueue_now(F("M600A")); // Save print and run M600 command queue.enqueue_now(F("M600A")); // Save print and run M600 A (automatic) command
} }
else { else {
marlin_stop_and_save_print_to_ram(); marlin_stop_and_save_print_to_ram();
@ -349,7 +349,7 @@ namespace MMU3 {
// MMU has finished its load, push the filament further by some defined constant length // MMU has finished its load, push the filament further by some defined constant length
// If the filament sensor reads 0 at any moment, then report FAILURE // If the filament sensor reads 0 at any moment, then report FAILURE
const float tryload_length = MMU2_CHECK_FILAMENT_PRESENCE_EXTRUSION_LENGTH - logic.ExtraLoadDistance(); const float tryload_length = MMU3_CHECK_FILAMENT_PRESENCE_EXTRUSION_LENGTH - logic.ExtraLoadDistance();
TryLoadUnloadReporter tlur(tryload_length); TryLoadUnloadReporter tlur(tryload_length);
/** /**
@ -378,7 +378,7 @@ namespace MMU3 {
// Pixel index will go from 0 to 10, then back from 10 to 0. // Pixel index will go from 0 to 10, then back from 10 to 0.
// A change in this value indicates a new pixel should be drawn on the display. // A change in this value indicates a new pixel should be drawn on the display.
for (uint8_t move = 0; move < 2; move++) { for (uint8_t move = 0; move < 2; move++) {
extruder_move(move == 0 ? tryload_length : -tryload_length, MMU2_VERIFY_LOAD_TO_NOZZLE_FEED_RATE); extruder_move(move == 0 ? tryload_length : -tryload_length, MMU3_VERIFY_LOAD_TO_NOZZLE_FEED_RATE);
while (planner_any_moves()) { while (planner_any_moves()) {
filament_inserted = filament_inserted && (WhereIsFilament() == FilamentState::AT_FSENSOR); filament_inserted = filament_inserted && (WhereIsFilament() == FilamentState::AT_FSENSOR);
tlur.Progress(filament_inserted); tlur.Progress(filament_inserted);
@ -392,7 +392,7 @@ namespace MMU3 {
} }
bool MMU3::toolChangeCommonOnce(uint8_t slot) { bool MMU3::toolChangeCommonOnce(uint8_t slot) {
static_assert(MMU2_MAX_RETRIES > 1); // Need >1 retries to do the cut in the last attempt static_assert(MMU3_MAX_RETRIES > 1); // Need >1 retries to do the cut in the last attempt
uint8_t retries = 0; uint8_t retries = 0;
for (;;) { for (;;) {
for (;;) { for (;;) {
@ -419,9 +419,9 @@ namespace MMU3 {
// Prepare a retry attempt // Prepare a retry attempt
unloadInner(); unloadInner();
if (retries == (MMU2_MAX_RETRIES) - 1 && cutter_enabled()) { if (retries == (MMU3_MAX_RETRIES) - 1 && cutter_enabled()) {
cutFilamentInner(slot); // try cutting filament tip at the last attempt cutFilamentInner(slot); // try cutting filament tip at the last attempt
retries = 0; // reset retries every MMU2_MAX_RETRIES retries = 0; // reset retries every MMU3_MAX_RETRIES
} }
++retries; ++retries;
@ -1013,7 +1013,7 @@ namespace MMU3 {
void MMU3::execute_load_to_nozzle_sequence() { void MMU3::execute_load_to_nozzle_sequence() {
planner_synchronize(); planner_synchronize();
// Compensate for configurable Extra Loading Distance // Compensate for configurable Extra Loading Distance
planner_set_current_position_E(planner_get_current_position_E() - (logic.ExtraLoadDistance() - MMU2_FILAMENT_SENSOR_POSITION)); planner_set_current_position_E(planner_get_current_position_E() - (logic.ExtraLoadDistance() - MMU3_FILAMENT_SENSOR_E_POSITION));
execute_extruder_sequence(load_to_nozzle_sequence, sizeof(load_to_nozzle_sequence) / sizeof(load_to_nozzle_sequence[0])); execute_extruder_sequence(load_to_nozzle_sequence, sizeof(load_to_nozzle_sequence) / sizeof(load_to_nozzle_sequence[0]));
} }
@ -1120,7 +1120,7 @@ namespace MMU3 {
} }
void __attribute__((noinline)) MMU3::helpUnloadToFinda() { void __attribute__((noinline)) MMU3::helpUnloadToFinda() {
extruder_move(-MMU2_RETRY_UNLOAD_TO_FINDA_LENGTH, MMU2_RETRY_UNLOAD_TO_FINDA_FEED_RATE); extruder_move(-MMU3_RETRY_UNLOAD_TO_FINDA_LENGTH, MMU3_RETRY_UNLOAD_TO_FINDA_FEED_RATE);
} }
void MMU3::onMMUProgressMsgSame(ProgressCode pc) { void MMU3::onMMUProgressMsgSame(ProgressCode pc) {

View file

@ -25,10 +25,10 @@
* mmu2.h * mmu2.h
*/ */
#include "mmu2_state.h" #include "mmu3_state.h"
#include "mmu2_marlin.h" #include "mmu3_marlin.h"
#include "mmu2_protocol_logic.h" #include "mmu3_protocol_logic.h"
#include "../../MarlinCore.h" #include "../../MarlinCore.h"
@ -43,8 +43,8 @@
float feedRate; //!< feed rate in mm/s float feedRate; //!< feed rate in mm/s
}; };
static constexpr E_Step ramming_sequence[] PROGMEM = { MMU2_RAMMING_SEQUENCE }; static constexpr E_Step ramming_sequence[] PROGMEM = { MMU3_RAMMING_SEQUENCE };
static constexpr E_Step load_to_nozzle_sequence[] PROGMEM = { MMU2_LOAD_TO_NOZZLE_SEQUENCE }; static constexpr E_Step load_to_nozzle_sequence[] PROGMEM = { MMU3_LOAD_TO_NOZZLE_SEQUENCE };
namespace MMU3 { namespace MMU3 {

View file

@ -28,7 +28,7 @@
#if HAS_PRUSA_MMU3 #if HAS_PRUSA_MMU3
#include "mmu2_crc.h" #include "mmu3_crc.h"
#ifdef __AVR__ #ifdef __AVR__
#include <util/crc16.h> #include <util/crc16.h>

View file

@ -29,7 +29,7 @@
#if HAS_PRUSA_MMU3 #if HAS_PRUSA_MMU3
#include "../../core/language.h" #include "../../core/language.h"
#include "mmu2_error_converter.h" #include "mmu3_error_converter.h"
#include "mmu_hw/error_codes.h" #include "mmu_hw/error_codes.h"
#include "mmu_hw/errors_list.h" #include "mmu_hw/errors_list.h"

View file

@ -29,7 +29,7 @@
#if HAS_PRUSA_MMU3 #if HAS_PRUSA_MMU3
#include "../../feature/runout.h" #include "../../feature/runout.h"
#include "mmu2_fsensor.h" #include "mmu3_fsensor.h"
namespace MMU3 { namespace MMU3 {

View file

@ -28,7 +28,7 @@
#if HAS_PRUSA_MMU3 #if HAS_PRUSA_MMU3
#include "mmu2_log.h" #include "mmu3_log.h"
namespace MMU3 { namespace MMU3 {

View file

@ -36,7 +36,7 @@
#include "../../feature/pause.h" #include "../../feature/pause.h"
#include "../../libs/nozzle.h" #include "../../libs/nozzle.h"
#include "mmu2_marlin.h" #include "mmu3_marlin.h"
namespace MMU3 { namespace MMU3 {

View file

@ -28,8 +28,8 @@
#if HAS_PRUSA_MMU3 #if HAS_PRUSA_MMU3
#include "mmu2.h" #include "mmu3.h"
#include "mmu2_power.h" #include "mmu3_power.h"
#include "../../MarlinCore.h" #include "../../MarlinCore.h"
@ -41,8 +41,8 @@ namespace MMU3 {
// On MK3 we cannot do actual power cycle on HW. Instead trigger a hardware reset. // On MK3 we cannot do actual power cycle on HW. Instead trigger a hardware reset.
void power_on() { void power_on() {
#if PIN_EXISTS(MMU2_RST) #if PIN_EXISTS(MMU_RST)
OUT_WRITE(MMU2_RST_PIN, HIGH); OUT_WRITE(MMU_RST_PIN, HIGH);
#endif #endif
power_reset(); power_reset();
} }
@ -50,10 +50,10 @@ void power_on() {
void power_off() {} void power_off() {}
void power_reset() { void power_reset() {
#if PIN_EXISTS(MMU2_RST) // HW - pulse reset pin #if PIN_EXISTS(MMU_RST) // HW - pulse reset pin
WRITE(MMU2_RST_PIN, LOW); WRITE(MMU_RST_PIN, LOW);
safe_delay(100); safe_delay(100);
WRITE(MMU2_RST_PIN, HIGH); WRITE(MMU_RST_PIN, HIGH);
#else #else
mmu3.reset(MMU3::Software); // TODO: Needs redesign. This power implementation shouldn't know anything about the MMU itself mmu3.reset(MMU3::Software); // TODO: Needs redesign. This power implementation shouldn't know anything about the MMU itself
#endif #endif

View file

@ -29,7 +29,7 @@
#if HAS_PRUSA_MMU3 #if HAS_PRUSA_MMU3
#include "../../core/language.h" #include "../../core/language.h"
#include "mmu2_progress_converter.h" #include "mmu3_progress_converter.h"
#include "mmu_hw/progress_codes.h" #include "mmu_hw/progress_codes.h"
#include "mmu_hw/errors_list.h" #include "mmu_hw/errors_list.h"

View file

@ -28,7 +28,7 @@
#if HAS_PRUSA_MMU3 #if HAS_PRUSA_MMU3
#include "mmu2_protocol.h" #include "mmu3_protocol.h"
// protocol definition // protocol definition
// command: Q0 // command: Q0

View file

@ -28,7 +28,7 @@
#include "../../MarlinCore.h" #include "../../MarlinCore.h"
#include <stdint.h> #include <stdint.h>
#include "mmu2_crc.h" #include "mmu3_crc.h"
// prevent ARM HAL macros from breaking our code // prevent ARM HAL macros from breaking our code
#undef CRC #undef CRC

View file

@ -28,9 +28,9 @@
#if HAS_PRUSA_MMU3 #if HAS_PRUSA_MMU3
#include "mmu2_protocol_logic.h" #include "mmu3_protocol_logic.h"
#include "mmu2_log.h" #include "mmu3_log.h"
#include "mmu2_fsensor.h" #include "mmu3_fsensor.h"
#ifdef __AVR__ #ifdef __AVR__
// on MK3/S/+ we shuffle the timers a bit, thus "_millis" may not equal "millis" // on MK3/S/+ we shuffle the timers a bit, thus "_millis" may not equal "millis"
@ -48,7 +48,7 @@
#endif #endif
#include <string.h> #include <string.h>
#include "mmu2_supported_version.h" #include "mmu3_supported_version.h"
namespace MMU3 { namespace MMU3 {
@ -186,7 +186,7 @@ namespace MMU3 {
OldMMUFWDetector oldMMUh4x0r; // old MMU FW hacker ;) OldMMUFWDetector oldMMUh4x0r; // old MMU FW hacker ;)
// try to consume as many rx bytes as possible (until a message has been completed) // try to consume as many rx bytes as possible (until a message has been completed)
while ((c = MMU2_SERIAL.read()) >= 0) { while ((c = MMU_SERIAL.read()) >= 0) {
++bytesConsumed; ++bytesConsumed;
RecordReceivedByte(c); RecordReceivedByte(c);
switch (protocol.DecodeResponse(c)) { switch (protocol.DecodeResponse(c)) {
@ -234,10 +234,10 @@ namespace MMU3 {
#if defined(__AVR__) || defined(TARGET_LPC1768) #if defined(__AVR__) || defined(TARGET_LPC1768)
// TODO: I'm not sure if this is the correct approach with AVR // TODO: I'm not sure if this is the correct approach with AVR
for ( uint8_t i = 0; i < len; i++) { for ( uint8_t i = 0; i < len; i++) {
MMU2_SERIAL.write(txbuff[i]); MMU_SERIAL.write(txbuff[i]);
} }
#else #else
MMU2_SERIAL.write(txbuff, len); MMU_SERIAL.write(txbuff, len);
#endif #endif
LogRequestMsg(txbuff, len); LogRequestMsg(txbuff, len);
RecordUARTActivity(); RecordUARTActivity();
@ -254,10 +254,10 @@ namespace MMU3 {
#if defined(__AVR__) || defined(TARGET_LPC1768) #if defined(__AVR__) || defined(TARGET_LPC1768)
// TODO: I'm not sure if this is the correct approach with AVR // TODO: I'm not sure if this is the correct approach with AVR
for ( uint8_t i = 0; i < len; i++) { for ( uint8_t i = 0; i < len; i++) {
MMU2_SERIAL.write(txbuff[i]); MMU_SERIAL.write(txbuff[i]);
} }
#else #else
MMU2_SERIAL.write(txbuff, len); MMU_SERIAL.write(txbuff, len);
#endif #endif
LogRequestMsg(txbuff, len); LogRequestMsg(txbuff, len);
RecordUARTActivity(); RecordUARTActivity();
@ -373,7 +373,7 @@ namespace MMU3 {
StepStatus ProtocolLogic::DelayedRestartWait() { StepStatus ProtocolLogic::DelayedRestartWait() {
if (Elapsed(heartBeatPeriod)) { // this basically means, that we are waiting until there is some traffic on if (Elapsed(heartBeatPeriod)) { // this basically means, that we are waiting until there is some traffic on
while (MMU2_SERIAL.read() != -1); // clear the input buffer while (MMU_SERIAL.read() != -1); // clear the input buffer
// switch to StartSeq // switch to StartSeq
start(); start();
} }
@ -587,7 +587,7 @@ namespace MMU3 {
, buttonCode(Buttons::NoButton) , buttonCode(Buttons::NoButton)
, lastFSensor((uint8_t)WhereIsFilament()) , lastFSensor((uint8_t)WhereIsFilament())
, regIndex(0) , regIndex(0)
, retryAttempts(MMU2_MAX_RETRIES) , retryAttempts(MMU3_MAX_RETRIES)
, inAutoRetry(false) { , inAutoRetry(false) {
// @@TODO currently, I don't see a way of writing the initialization better :( // @@TODO currently, I don't see a way of writing the initialization better :(
// I'd like to write something like: initRegs8 { extraLoadDistance, pulleySlowFeedrate } // I'd like to write something like: initRegs8 { extraLoadDistance, pulleySlowFeedrate }
@ -803,14 +803,14 @@ namespace MMU3 {
} }
StepStatus ProtocolLogic::HandleCommunicationTimeout() { StepStatus ProtocolLogic::HandleCommunicationTimeout() {
MMU2_SERIAL.flush(); // clear the output buffer MMU_SERIAL.flush(); // clear the output buffer
protocol.ResetResponseDecoder(); protocol.ResetResponseDecoder();
start(); start();
return SuppressShortDropOuts(PSTR("Communication timeout"), CommunicationTimeout); return SuppressShortDropOuts(PSTR("Communication timeout"), CommunicationTimeout);
} }
StepStatus ProtocolLogic::HandleProtocolError() { StepStatus ProtocolLogic::HandleProtocolError() {
MMU2_SERIAL.flush(); // clear the output buffer MMU_SERIAL.flush(); // clear the output buffer
state = State::InitSequence; state = State::InitSequence;
currentScope = Scope::DelayedRestart; currentScope = Scope::DelayedRestart;
DelayedRestartRestart(); DelayedRestartRestart();
@ -880,7 +880,7 @@ namespace MMU3 {
void ProtocolLogic::ResetRetryAttempts() { void ProtocolLogic::ResetRetryAttempts() {
SERIAL_ECHOLNPGM("ResetRetryAttempts"); SERIAL_ECHOLNPGM("ResetRetryAttempts");
retryAttempts = MMU2_MAX_RETRIES; retryAttempts = MMU3_MAX_RETRIES;
} }
void __attribute__((noinline)) ProtocolLogic::ResetCommunicationTimeoutAttempts() { void __attribute__((noinline)) ProtocolLogic::ResetCommunicationTimeoutAttempts() {

View file

@ -35,7 +35,7 @@
#include "mmu_hw/progress_codes.h" #include "mmu_hw/progress_codes.h"
#include "mmu_hw/buttons.h" #include "mmu_hw/buttons.h"
#include "mmu_hw/registers.h" #include "mmu_hw/registers.h"
#include "mmu2_protocol.h" #include "mmu3_protocol.h"
// #include <array> std array is not available on AVR ... we need to "fake" it // #include <array> std array is not available on AVR ... we need to "fake" it
namespace std { namespace std {
@ -59,7 +59,7 @@
// Prevent ARM HAL macros from breaking our code // Prevent ARM HAL macros from breaking our code
#undef CRC #undef CRC
#include "mmu2_protocol.h" #include "mmu3_protocol.h"
#include "mmu_hw/buttons.h" #include "mmu_hw/buttons.h"
#include "registers.h" #include "registers.h"

View file

@ -28,13 +28,13 @@
#if HAS_PRUSA_MMU3 #if HAS_PRUSA_MMU3
#include "mmu2.h" #include "mmu3.h"
#include "mmu2_log.h" #include "mmu3_log.h"
#include "mmu2_fsensor.h" #include "mmu3_fsensor.h"
#include "mmu2_reporting.h" #include "mmu3_reporting.h"
#include "mmu2_error_converter.h" #include "mmu3_error_converter.h"
#include "mmu2_marlin_macros.h" #include "mmu3_marlin_macros.h"
#include "mmu2_progress_converter.h" #include "mmu3_progress_converter.h"
#include "mmu_hw/buttons.h" #include "mmu_hw/buttons.h"
#include "mmu_hw/error_codes.h" #include "mmu_hw/error_codes.h"
#include "mmu_hw/errors_list.h" #include "mmu_hw/errors_list.h"

View file

@ -28,8 +28,8 @@
#if HAS_PRUSA_MMU3 #if HAS_PRUSA_MMU3
#include "mmu2.h" #include "mmu3.h"
#include "mmu2_marlin_macros.h" #include "mmu3_marlin_macros.h"
#include "mmu_hw/errors_list.h" #include "mmu_hw/errors_list.h"
#include "ultralcd.h" #include "ultralcd.h"

View file

@ -32,7 +32,7 @@
#endif #endif
#if HAS_PRUSA_MMU3 #if HAS_PRUSA_MMU3
#include "../../feature/mmu3/mmu2.h" #include "../../feature/mmu3/mmu3.h"
#elif HAS_PRUSA_MMU2 #elif HAS_PRUSA_MMU2
#include "../../feature/mmu/mmu2.h" #include "../../feature/mmu/mmu2.h"
#endif #endif

View file

@ -39,7 +39,7 @@
#endif #endif
#if HAS_PRUSA_MMU3 #if HAS_PRUSA_MMU3
#include "../../../feature/mmu3/mmu2.h" #include "../../../feature/mmu3/mmu3.h"
#if ENABLED(MMU_MENUS) #if ENABLED(MMU_MENUS)
#include "../../../lcd/menu/menu_mmu2.h" #include "../../../lcd/menu/menu_mmu2.h"
#endif #endif

View file

@ -36,7 +36,7 @@
#endif #endif
#if HAS_PRUSA_MMU3 #if HAS_PRUSA_MMU3
#include "../../../feature/mmu3/mmu2.h" #include "../../../feature/mmu3/mmu3.h"
#elif HAS_PRUSA_MMU2 #elif HAS_PRUSA_MMU2
#include "../../../feature/mmu/mmu2.h" #include "../../../feature/mmu/mmu2.h"
#endif #endif

View file

@ -27,7 +27,7 @@
#include "../../gcode.h" #include "../../gcode.h"
#if HAS_PRUSA_MMU3 #if HAS_PRUSA_MMU3
#include "../../../feature/mmu3/mmu2.h" #include "../../../feature/mmu3/mmu3.h"
#elif HAS_PRUSA_MMU2 #elif HAS_PRUSA_MMU2
#include "../../../feature/mmu/mmu2.h" #include "../../../feature/mmu/mmu2.h"
#endif #endif

View file

@ -26,8 +26,8 @@
#include "../../gcode.h" #include "../../gcode.h"
#include "../../../module/settings.h" #include "../../../module/settings.h"
#include "../../../feature/mmu3/mmu2.h" #include "../../../feature/mmu3/mmu3.h"
#include "../../../feature/mmu3/mmu2_reporting.h" #include "../../../feature/mmu3/mmu3_reporting.h"
#include "../../../feature/mmu3/SpoolJoin.h" #include "../../../feature/mmu3/SpoolJoin.h"
// Shared by the G-codes below to save flash memory. // Shared by the G-codes below to save flash memory.
@ -39,7 +39,7 @@ static void gcodes_M704_M705_M706(uint16_t gcode) {
case 704: mmu3.load_to_feeder(mmuSlotIndex); break; case 704: mmu3.load_to_feeder(mmuSlotIndex); break;
case 705: mmu3.eject_filament(mmuSlotIndex, false); break; case 705: mmu3.eject_filament(mmuSlotIndex, false); break;
case 706: case 706:
#if ENABLED(MMU_HAS_CUTTER) #if ENABLED(MMU3_HAS_CUTTER)
if (mmu3.cutter_mode > 0) mmu3.cut_filament(mmuSlotIndex); if (mmu3.cutter_mode > 0) mmu3.cut_filament(mmuSlotIndex);
#endif #endif
break; break;
@ -187,7 +187,7 @@ void GcodeSuite::MMU3_report(const bool forReplay/*=true*/) {
report_heading(forReplay, F("MMU3 Operational Stats")); report_heading(forReplay, F("MMU3 Operational Stats"));
SERIAL_ECHOPGM(" MMU "); serialprintln_onoff(mmu3.mmu_hw_enabled); SERIAL_ECHOPGM(" MMU "); serialprintln_onoff(mmu3.mmu_hw_enabled);
SERIAL_ECHOPGM(" Stealth Mode "); serialprintln_onoff(mmu3.stealth_mode); SERIAL_ECHOPGM(" Stealth Mode "); serialprintln_onoff(mmu3.stealth_mode);
#if ENABLED(MMU_HAS_CUTTER) #if ENABLED(MMU3_HAS_CUTTER)
SERIAL_ECHOPGM(" Cutter "); SERIAL_ECHOPGM(" Cutter ");
serialprintln_onoff(mmu3.cutter_mode != 0); serialprintln_onoff(mmu3.cutter_mode != 0);
#endif #endif

View file

@ -468,7 +468,7 @@
#elif defined(ANYCUBIC_LCD_SERIAL_PORT) #elif defined(ANYCUBIC_LCD_SERIAL_PORT)
#error "ANYCUBIC_LCD_SERIAL_PORT is now LCD_SERIAL_PORT." #error "ANYCUBIC_LCD_SERIAL_PORT is now LCD_SERIAL_PORT."
#elif defined(INTERNAL_SERIAL_PORT) #elif defined(INTERNAL_SERIAL_PORT)
#error "INTERNAL_SERIAL_PORT is now MMU2_SERIAL_PORT." #error "INTERNAL_SERIAL_PORT is now MMU_SERIAL_PORT."
#elif defined(X_DUAL_ENDSTOPS_ADJUSTMENT) || defined(Y_DUAL_ENDSTOPS_ADJUSTMENT) || defined(Z_DUAL_ENDSTOPS_ADJUSTMENT) #elif defined(X_DUAL_ENDSTOPS_ADJUSTMENT) || defined(Y_DUAL_ENDSTOPS_ADJUSTMENT) || defined(Z_DUAL_ENDSTOPS_ADJUSTMENT)
#error "[XYZ]_DUAL_ENDSTOPS_ADJUSTMENT is now [XYZ]2_ENDSTOP_ADJUSTMENT." #error "[XYZ]_DUAL_ENDSTOPS_ADJUSTMENT is now [XYZ]2_ENDSTOP_ADJUSTMENT."
#elif defined(Z_TRIPLE_ENDSTOPS_ADJUSTMENT2) || defined(Z_TRIPLE_ENDSTOPS_ADJUSTMENT3) #elif defined(Z_TRIPLE_ENDSTOPS_ADJUSTMENT2) || defined(Z_TRIPLE_ENDSTOPS_ADJUSTMENT3)
@ -701,6 +701,46 @@
#error "CALIBRATION_MEASUREMENT_RESOLUTION is no longer needed and should be removed." #error "CALIBRATION_MEASUREMENT_RESOLUTION is no longer needed and should be removed."
#elif defined(MMU2_MENUS) #elif defined(MMU2_MENUS)
#error "MMU2_MENUS is now MMU_MENUS." #error "MMU2_MENUS is now MMU_MENUS."
#elif defined(MMU2_SERIAL_PORT)
#error "MMU2_SERIAL_PORT is now MMU_SERIAL_PORT."
#elif defined(MMU2_RST_PIN)
#error "MMU2_RST_PIN is now MMU_RST_PIN."
#elif defined(MMU2_MAX_RETRIES)
#error "MMU2_MAX_RETRIES is now MMU3_MAX_RETRIES."
#elif defined(MMU2_FILAMENT_SENSOR_POSITION)
#error "MMU2_FILAMENT_SENSOR_POSITION is now MMU3_FILAMENT_SENSOR_POSITION."
#elif defined(MMU2_TOOL_CHANGE_LOAD_LENGTH)
#error "MMU2_TOOL_CHANGE_LOAD_LENGTH is now MMU3_TOOL_CHANGE_LOAD_LENGTH."
#elif defined(MMU2_LOAD_TO_NOZZLE_FEED_RATE)
#error "MMU2_LOAD_TO_NOZZLE_FEED_RATE is now MMU3_LOAD_TO_NOZZLE_FEED_RATE."
#elif defined(MMU2_UNLOAD_TO_FINDA_FEED_RATE)
#error "MMU2_UNLOAD_TO_FINDA_FEED_RATE is no longer needed and should be removed."
#elif defined(MMU2_VERIFY_LOAD_TO_NOZZLE_FEED_RATE)
#error "MMU2_VERIFY_LOAD_TO_NOZZLE_FEED_RATE is now MMU3_VERIFY_LOAD_TO_NOZZLE_FEED_RATE."
#elif defined(MMU2_RETRY_UNLOAD_TO_FINDA_LENGTH)
#error "MMU2_RETRY_UNLOAD_TO_FINDA_LENGTH is now MMU3_RETRY_UNLOAD_TO_FINDA_LENGTH."
#elif defined(MMU2_RETRY_UNLOAD_TO_FINDA_FEED_RATE)
#error "MMU2_RETRY_UNLOAD_TO_FINDA_FEED_RATE is now MMU3_RETRY_UNLOAD_TO_FINDA_FEED_RATE."
#elif defined(MMU2_FILAMENT_SENSOR_POSITION)
#error "MMU2_FILAMENT_SENSOR_POSITION is now MMU3_FILAMENT_SENSOR_E_POSITION."
#elif defined(MMU2_CHECK_FILAMENT_PRESENCE_EXTRUSION_LENGTH)
#error "MMU2_CHECK_FILAMENT_PRESENCE_EXTRUSION_LENGTH is now MMU3_CHECK_FILAMENT_PRESENCE_EXTRUSION_LENGTH."
#elif defined(MMU_HAS_CUTTER)
#error "MMU_HAS_CUTTER is now MMU3_HAS_CUTTER."
#elif defined(MMU_FORCE_STEALTH_MODE)
#error "MMU_FORCE_STEALTH_MODE is obsolete and should be removed."
#elif defined(MMU_SPOOL_JOIN_CONSUMES_ALL_FILAMENT)
#error "MMU_SPOOL_JOIN_CONSUMES_ALL_FILAMENT is now MMU3_SPOOL_JOIN_CONSUMES_ALL_FILAMENT."
#elif HAS_PRUSA_MMU3 && defined(MMU2_LOAD_TO_NOZZLE_SEQUENCE)
#error "MMU2_LOAD_TO_NOZZLE_SEQUENCE is now MMU3_LOAD_TO_NOZZLE_SEQUENCE for MMU_MODEL MMU3."
#elif HAS_PRUSA_MMU3 && defined(MMU2_RAMMING_SEQUENCE)
#error "MMU2_RAMMING_SEQUENCE is now MMU3_RAMMING_SEQUENCE for MMU_MODEL MMU3."
#elif defined(MMU_EXTRUDER_SENSOR)
#error "MMU_EXTRUDER_SENSOR is now MMU2_EXTRUDER_SENSOR."
#elif defined(MMU_LOADING_ATTEMPTS_NR)
#error "MMU_LOADING_ATTEMPTS_NR is now MMU2_LOADING_ATTEMPTS_NR."
#elif defined(MMU2_DEBUG)
#error "MMU2_DEBUG is now MMU_DEBUG."
#elif defined(FTM_SHAPING_DEFAULT_X_FREQ) || defined(FTM_SHAPING_DEFAULT_Y_FREQ) #elif defined(FTM_SHAPING_DEFAULT_X_FREQ) || defined(FTM_SHAPING_DEFAULT_Y_FREQ)
#error "FTM_SHAPING_DEFAULT_[XY]_FREQ is now FTM_SHAPING_DEFAULT_FREQ_[XY]." #error "FTM_SHAPING_DEFAULT_[XY]_FREQ is now FTM_SHAPING_DEFAULT_FREQ_[XY]."
#endif #endif

View file

@ -1851,7 +1851,7 @@
#define SERIAL_IN_USE(N) ( (defined(SERIAL_PORT) && N == SERIAL_PORT) \ #define SERIAL_IN_USE(N) ( (defined(SERIAL_PORT) && N == SERIAL_PORT) \
|| (defined(SERIAL_PORT_2) && N == SERIAL_PORT_2) \ || (defined(SERIAL_PORT_2) && N == SERIAL_PORT_2) \
|| (defined(SERIAL_PORT_3) && N == SERIAL_PORT_3) \ || (defined(SERIAL_PORT_3) && N == SERIAL_PORT_3) \
|| (defined(MMU2_SERIAL_PORT) && N == MMU2_SERIAL_PORT) \ || (defined(MMU_SERIAL_PORT) && N == MMU_SERIAL_PORT) \
|| (defined(LCD_SERIAL_PORT) && N == LCD_SERIAL_PORT) \ || (defined(LCD_SERIAL_PORT) && N == LCD_SERIAL_PORT) \
|| (defined(RS485_SERIAL_PORT) && N == RS485_SERIAL_PORT) ) || (defined(RS485_SERIAL_PORT) && N == RS485_SERIAL_PORT) )

View file

@ -615,10 +615,10 @@ static_assert(COUNT(arm) == LOGICAL_AXES, "AXIS_RELATIVE_MODES must contain " _L
#error "PRUSA_MMU2(S) requires NOZZLE_PARK_FEATURE. Enable it to continue." #error "PRUSA_MMU2(S) requires NOZZLE_PARK_FEATURE. Enable it to continue."
#elif (HAS_PRUSA_MMU2S || HAS_PRUSA_MMU3) && DISABLED(FILAMENT_RUNOUT_SENSOR) #elif (HAS_PRUSA_MMU2S || HAS_PRUSA_MMU3) && DISABLED(FILAMENT_RUNOUT_SENSOR)
#error "PRUSA_MMU2S and HAS_PRUSA_MMU3 requires FILAMENT_RUNOUT_SENSOR. Enable it to continue." #error "PRUSA_MMU2S and HAS_PRUSA_MMU3 requires FILAMENT_RUNOUT_SENSOR. Enable it to continue."
#elif ENABLED(MMU_EXTRUDER_SENSOR) && DISABLED(FILAMENT_RUNOUT_SENSOR) #elif ENABLED(MMU2_EXTRUDER_SENSOR) && DISABLED(FILAMENT_RUNOUT_SENSOR)
#error "MMU_EXTRUDER_SENSOR requires FILAMENT_RUNOUT_SENSOR. Enable it to continue." #error "MMU2_EXTRUDER_SENSOR requires FILAMENT_RUNOUT_SENSOR. Enable it to continue."
#elif ENABLED(MMU_EXTRUDER_SENSOR) && !HAS_MARLINUI_MENU #elif ENABLED(MMU2_EXTRUDER_SENSOR) && !HAS_MARLINUI_MENU
#error "MMU_EXTRUDER_SENSOR requires an LCD supporting MarlinUI." #error "MMU2_EXTRUDER_SENSOR requires an LCD supporting MarlinUI."
#elif ENABLED(MMU_MENUS) && !HAS_MARLINUI_MENU #elif ENABLED(MMU_MENUS) && !HAS_MARLINUI_MENU
#error "MMU_MENUS requires an LCD supporting MarlinUI." #error "MMU_MENUS requires an LCD supporting MarlinUI."
#elif HAS_PRUSA_MMU3 && !HAS_MARLINUI_MENU #elif HAS_PRUSA_MMU3 && !HAS_MARLINUI_MENU
@ -628,7 +628,7 @@ static_assert(COUNT(arm) == LOGICAL_AXES, "AXIS_RELATIVE_MODES must contain " _L
#elif HAS_PRUSA_MMU3 && DISABLED(EEPROM_SETTINGS) #elif HAS_PRUSA_MMU3 && DISABLED(EEPROM_SETTINGS)
#error "MMU3 requires EEPROM_SETTINGS." #error "MMU3 requires EEPROM_SETTINGS."
#elif DISABLED(ADVANCED_PAUSE_FEATURE) #elif DISABLED(ADVANCED_PAUSE_FEATURE)
static_assert(nullptr == strstr(MMU2_FILAMENT_RUNOUT_SCRIPT, "M600"), "MMU2_FILAMENT_RUNOUT_SCRIPT cannot make use of M600 unless ADVANCED_PAUSE_FEATURE is enabled"); static_assert(nullptr == strstr(MMU2_FILAMENT_RUNOUT_SCRIPT, "M600"), "ADVANCED_PAUSE_FEATURE is required for MMU2_FILAMENT_RUNOUT_SCRIPT to use M600.");
#endif #endif
#endif #endif
@ -2944,8 +2944,8 @@ static_assert(NUM_SERVOS <= NUM_SERVO_PLUGS, "NUM_SERVOS (or some servo index) i
#error "SERIAL_PORT is set to -1, but the MOTHERBOARD has no native USB support. Set SERIAL_PORT to a valid value for your board." #error "SERIAL_PORT is set to -1, but the MOTHERBOARD has no native USB support. Set SERIAL_PORT to a valid value for your board."
#elif SERIAL_PORT_2 == -1 #elif SERIAL_PORT_2 == -1
#error "SERIAL_PORT_2 is set to -1, but the MOTHERBOARD has no native USB support. Set SERIAL_PORT_2 to a valid value for your board." #error "SERIAL_PORT_2 is set to -1, but the MOTHERBOARD has no native USB support. Set SERIAL_PORT_2 to a valid value for your board."
#elif MMU2_SERIAL_PORT == -1 #elif MMU_SERIAL_PORT == -1
#error "MMU2_SERIAL_PORT is set to -1, but the MOTHERBOARD has no native USB support. Set MMU2_SERIAL_PORT to a valid value for your board." #error "MMU_SERIAL_PORT is set to -1, but the MOTHERBOARD has no native USB support. Set MMU_SERIAL_PORT to a valid value for your board."
#elif LCD_SERIAL_PORT == -1 #elif LCD_SERIAL_PORT == -1
#error "LCD_SERIAL_PORT is set to -1, but the MOTHERBOARD has no native USB support. Set LCD_SERIAL_PORT to a valid value for your board." #error "LCD_SERIAL_PORT is set to -1, but the MOTHERBOARD has no native USB support. Set LCD_SERIAL_PORT to a valid value for your board."
#endif #endif
@ -2954,15 +2954,15 @@ static_assert(NUM_SERVOS <= NUM_SERVO_PLUGS, "NUM_SERVOS (or some servo index) i
/** /**
* MMU2 require a dedicated serial port * MMU2 require a dedicated serial port
*/ */
#ifdef MMU2_SERIAL_PORT #ifdef MMU_SERIAL_PORT
#if MMU2_SERIAL_PORT == SERIAL_PORT #if MMU_SERIAL_PORT == SERIAL_PORT
#error "MMU2_SERIAL_PORT cannot be the same as SERIAL_PORT." #error "MMU_SERIAL_PORT cannot be the same as SERIAL_PORT."
#elif defined(SERIAL_PORT_2) && MMU2_SERIAL_PORT == SERIAL_PORT_2 #elif defined(SERIAL_PORT_2) && MMU_SERIAL_PORT == SERIAL_PORT_2
#error "MMU2_SERIAL_PORT cannot be the same as SERIAL_PORT_2." #error "MMU_SERIAL_PORT cannot be the same as SERIAL_PORT_2."
#elif defined(LCD_SERIAL_PORT) && MMU2_SERIAL_PORT == LCD_SERIAL_PORT #elif defined(LCD_SERIAL_PORT) && MMU_SERIAL_PORT == LCD_SERIAL_PORT
#error "MMU2_SERIAL_PORT cannot be the same as LCD_SERIAL_PORT." #error "MMU_SERIAL_PORT cannot be the same as LCD_SERIAL_PORT."
#elif defined(RS485_SERIAL_PORT) && MMU2_SERIAL_PORT == RS485_SERIAL_PORT #elif defined(RS485_SERIAL_PORT) && MMU_SERIAL_PORT == RS485_SERIAL_PORT
#error "MMU2_SERIAL_PORT cannot be the same as RS485_SERIAL_PORT." #error "MMU_SERIAL_PORT cannot be the same as RS485_SERIAL_PORT."
#endif #endif
#endif #endif

View file

@ -27,8 +27,8 @@
#include "../../MarlinCore.h" #include "../../MarlinCore.h"
#if HAS_PRUSA_MMU3 #if HAS_PRUSA_MMU3
#include "../../feature/mmu3/mmu2.h" #include "../../feature/mmu3/mmu3.h"
#include "../../feature/mmu3/mmu2_reporting.h" #include "../../feature/mmu3/mmu3_reporting.h"
#include "../../feature/mmu3/SpoolJoin.h" #include "../../feature/mmu3/SpoolJoin.h"
#else #else
#include "../../feature/mmu/mmu2.h" #include "../../feature/mmu/mmu2.h"
@ -263,7 +263,7 @@ void menu_mmu3_statistics() {
void action_mmu2_reset() { void action_mmu2_reset() {
#if HAS_PRUSA_MMU3 #if HAS_PRUSA_MMU3
#if PIN_EXISTS(MMU2_RST) #if PIN_EXISTS(MMU_RST)
mmu3.reset(MMU3::MMU3::ResetForm::ResetPin); mmu3.reset(MMU3::MMU3::ResetForm::ResetPin);
#else #else
mmu3.reset(MMU3::MMU3::ResetForm::Software); mmu3.reset(MMU3::MMU3::ResetForm::Software);

View file

@ -179,9 +179,9 @@
#endif #endif
#if HAS_PRUSA_MMU3 #if HAS_PRUSA_MMU3
#include "../feature/mmu3/mmu2.h" #include "../feature/mmu3/mmu3.h"
#include "../feature/mmu3/SpoolJoin.h" #include "../feature/mmu3/SpoolJoin.h"
#include "../feature/mmu3/mmu2_reporting.h" #include "../feature/mmu3/mmu3_reporting.h"
#endif #endif
#pragma pack(push, 1) // No padding between variables #pragma pack(push, 1) // No padding between variables

View file

@ -77,7 +77,7 @@
#endif #endif
#if HAS_PRUSA_MMU3 #if HAS_PRUSA_MMU3
#include "../feature/mmu3/mmu2.h" #include "../feature/mmu3/mmu3.h"
#elif HAS_PRUSA_MMU2 #elif HAS_PRUSA_MMU2
#include "../feature/mmu/mmu2.h" #include "../feature/mmu/mmu2.h"
#elif HAS_PRUSA_MMU1 #elif HAS_PRUSA_MMU1

View file

@ -2180,8 +2180,8 @@
// //
// MMU2 // MMU2
// //
#if PIN_EXISTS(MMU2_RST) #if PIN_EXISTS(MMU_RST)
REPORT_NAME_DIGITAL(__LINE__, MMU2_RST_PIN) REPORT_NAME_DIGITAL(__LINE__, MMU_RST_PIN)
#endif #endif
// //

View file

@ -3055,7 +3055,7 @@ cmt_multi_first_len_minimum = 4 # unsigned number
# Path to a file that contains text to insert at the beginning of a file if # Path to a file that contains text to insert at the beginning of a file if
# the file doesn't start with a C/C++ comment. If the inserted text contains # the file doesn't start with a C/C++ comment. If the inserted text contains
# '$(filename)', that will be replaced with the current file's name. # '$(filename)', that will be replaced with the current file's name.
cmt_insert_file_header = "./buildroot/share/extras/file_header.h" # string cmt_insert_file_header = "./buildroot/share/uncrustify/file_header.h" # string
# Path to a file that contains text to insert at the end of a file if the # Path to a file that contains text to insert at the end of a file if the
# file doesn't end with a C/C++ comment. If the inserted text contains # file doesn't end with a C/C++ comment. If the inserted text contains

View file

@ -74,7 +74,7 @@ opt_set MOTHERBOARD BOARD_BTT_SKR_V1_4 SERIAL_PORT -1 \
Z_STEPPER_ALIGN_XY '{{10,110},{200,110}}' \ Z_STEPPER_ALIGN_XY '{{10,110},{200,110}}' \
Z_STEPPER_ALIGN_ITERATIONS 10 DEFAULT_STEPPER_TIMEOUT_SEC 0 \ Z_STEPPER_ALIGN_ITERATIONS 10 DEFAULT_STEPPER_TIMEOUT_SEC 0 \
SLOWDOWN_DIVISOR 16 SDCARD_CONNECTION ONBOARD BLOCK_BUFFER_SIZE 64 \ SLOWDOWN_DIVISOR 16 SDCARD_CONNECTION ONBOARD BLOCK_BUFFER_SIZE 64 \
CHOPPER_TIMING CHOPPER_DEFAULT_24V MMU2_SERIAL_PORT 0 CHOPPER_TIMING CHOPPER_DEFAULT_24V MMU_SERIAL_PORT 0
opt_enable PIDTEMPBED S_CURVE_ACCELERATION \ opt_enable PIDTEMPBED S_CURVE_ACCELERATION \
USE_PROBE_FOR_Z_HOMING BLTOUCH FILAMENT_RUNOUT_SENSOR \ USE_PROBE_FOR_Z_HOMING BLTOUCH FILAMENT_RUNOUT_SENSOR \
AUTO_BED_LEVELING_BILINEAR RESTORE_LEVELING_AFTER_G28 \ AUTO_BED_LEVELING_BILINEAR RESTORE_LEVELING_AFTER_G28 \
@ -89,7 +89,7 @@ opt_enable PIDTEMPBED S_CURVE_ACCELERATION \
DOUBLECLICK_FOR_Z_BABYSTEPPING BABYSTEP_DISPLAY_TOTAL LIN_ADVANCE \ DOUBLECLICK_FOR_Z_BABYSTEPPING BABYSTEP_DISPLAY_TOTAL LIN_ADVANCE \
BEZIER_CURVE_SUPPORT EMERGENCY_PARSER ADVANCED_PAUSE_FEATURE \ BEZIER_CURVE_SUPPORT EMERGENCY_PARSER ADVANCED_PAUSE_FEATURE \
TMC_DEBUG HOST_ACTION_COMMANDS HOST_PAUSE_M76 HOST_PROMPT_SUPPORT \ TMC_DEBUG HOST_ACTION_COMMANDS HOST_PAUSE_M76 HOST_PROMPT_SUPPORT \
HOST_STATUS_NOTIFICATIONS MMU2_DEBUG HOST_STATUS_NOTIFICATIONS MMU_DEBUG
opt_disable Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN FILAMENT_LOAD_UNLOAD_GCODES \ opt_disable Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN FILAMENT_LOAD_UNLOAD_GCODES \
PARK_HEAD_ON_PAUSE PARK_HEAD_ON_PAUSE
exec_test $1 $2 "BigTreeTech SKR 1.4 | MMU2" "$3" exec_test $1 $2 "BigTreeTech SKR 1.4 | MMU2" "$3"

View file

@ -79,7 +79,7 @@ opt_set MOTHERBOARD BOARD_BTT_SKR_V1_4_TURBO SERIAL_PORT -1 \
Z_STEPPER_ALIGN_XY '{{10,110},{200,110}}' \ Z_STEPPER_ALIGN_XY '{{10,110},{200,110}}' \
Z_STEPPER_ALIGN_ITERATIONS 10 DEFAULT_STEPPER_TIMEOUT_SEC 0 \ Z_STEPPER_ALIGN_ITERATIONS 10 DEFAULT_STEPPER_TIMEOUT_SEC 0 \
SLOWDOWN_DIVISOR 16 SDCARD_CONNECTION ONBOARD BLOCK_BUFFER_SIZE 64 \ SLOWDOWN_DIVISOR 16 SDCARD_CONNECTION ONBOARD BLOCK_BUFFER_SIZE 64 \
CHOPPER_TIMING CHOPPER_DEFAULT_24V MMU2_SERIAL_PORT 0 \ CHOPPER_TIMING CHOPPER_DEFAULT_24V MMU_SERIAL_PORT 0 \
Z_MIN_ENDSTOP_HIT_STATE HIGH Z_MIN_ENDSTOP_HIT_STATE HIGH
opt_enable PIDTEMPBED S_CURVE_ACCELERATION \ opt_enable PIDTEMPBED S_CURVE_ACCELERATION \
USE_PROBE_FOR_Z_HOMING BLTOUCH FILAMENT_RUNOUT_SENSOR \ USE_PROBE_FOR_Z_HOMING BLTOUCH FILAMENT_RUNOUT_SENSOR \
@ -95,6 +95,6 @@ opt_enable PIDTEMPBED S_CURVE_ACCELERATION \
DOUBLECLICK_FOR_Z_BABYSTEPPING BABYSTEP_DISPLAY_TOTAL LIN_ADVANCE \ DOUBLECLICK_FOR_Z_BABYSTEPPING BABYSTEP_DISPLAY_TOTAL LIN_ADVANCE \
BEZIER_CURVE_SUPPORT EMERGENCY_PARSER ADVANCED_PAUSE_FEATURE \ BEZIER_CURVE_SUPPORT EMERGENCY_PARSER ADVANCED_PAUSE_FEATURE \
TMC_DEBUG HOST_ACTION_COMMANDS HOST_PAUSE_M76 HOST_PROMPT_SUPPORT HOST_STATUS_NOTIFICATIONS \ TMC_DEBUG HOST_ACTION_COMMANDS HOST_PAUSE_M76 HOST_PROMPT_SUPPORT HOST_STATUS_NOTIFICATIONS \
MMU_SPOOL_JOIN_CONSUMES_ALL_FILAMENT MMU_MENUS MMU2_DEBUG MMU3_SPOOL_JOIN_CONSUMES_ALL_FILAMENT MMU_MENUS MMU_DEBUG
opt_disable Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN FILAMENT_LOAD_UNLOAD_GCODES PARK_HEAD_ON_PAUSE opt_disable Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN FILAMENT_LOAD_UNLOAD_GCODES PARK_HEAD_ON_PAUSE
exec_test $1 $2 "BigTreeTech SKR 1.4 Turbo | MMU3" "$3" exec_test $1 $2 "BigTreeTech SKR 1.4 Turbo | MMU3" "$3"

View file

@ -37,7 +37,7 @@ opt_set MOTHERBOARD BOARD_BTT_SKR_V3_0_EZ SERIAL_PORT -1 \
Z_STEPPER_ALIGN_XY '{{10,110},{200,110}}' \ Z_STEPPER_ALIGN_XY '{{10,110},{200,110}}' \
Z_STEPPER_ALIGN_ITERATIONS 10 DEFAULT_STEPPER_TIMEOUT_SEC 0 \ Z_STEPPER_ALIGN_ITERATIONS 10 DEFAULT_STEPPER_TIMEOUT_SEC 0 \
SLOWDOWN_DIVISOR 16 SDCARD_CONNECTION ONBOARD BLOCK_BUFFER_SIZE 64 \ SLOWDOWN_DIVISOR 16 SDCARD_CONNECTION ONBOARD BLOCK_BUFFER_SIZE 64 \
CHOPPER_TIMING CHOPPER_DEFAULT_24V MMU2_SERIAL_PORT 2 CHOPPER_TIMING CHOPPER_DEFAULT_24V MMU_SERIAL_PORT 2
opt_enable PIDTEMPBED ENDSTOP_INTERRUPTS_FEATURE S_CURVE_ACCELERATION \ opt_enable PIDTEMPBED ENDSTOP_INTERRUPTS_FEATURE S_CURVE_ACCELERATION \
USE_PROBE_FOR_Z_HOMING BLTOUCH FILAMENT_RUNOUT_SENSOR \ USE_PROBE_FOR_Z_HOMING BLTOUCH FILAMENT_RUNOUT_SENSOR \
AUTO_BED_LEVELING_BILINEAR RESTORE_LEVELING_AFTER_G28 \ AUTO_BED_LEVELING_BILINEAR RESTORE_LEVELING_AFTER_G28 \
@ -52,7 +52,7 @@ opt_enable PIDTEMPBED ENDSTOP_INTERRUPTS_FEATURE S_CURVE_ACCELERATION \
DOUBLECLICK_FOR_Z_BABYSTEPPING BABYSTEP_DISPLAY_TOTAL LIN_ADVANCE \ DOUBLECLICK_FOR_Z_BABYSTEPPING BABYSTEP_DISPLAY_TOTAL LIN_ADVANCE \
BEZIER_CURVE_SUPPORT EMERGENCY_PARSER ADVANCED_PAUSE_FEATURE \ BEZIER_CURVE_SUPPORT EMERGENCY_PARSER ADVANCED_PAUSE_FEATURE \
TMC_DEBUG HOST_ACTION_COMMANDS HOST_PAUSE_M76 HOST_PROMPT_SUPPORT HOST_STATUS_NOTIFICATIONS \ TMC_DEBUG HOST_ACTION_COMMANDS HOST_PAUSE_M76 HOST_PROMPT_SUPPORT HOST_STATUS_NOTIFICATIONS \
MMU2_DEBUG MMU_DEBUG
opt_disable Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN FILAMENT_LOAD_UNLOAD_GCODES PARK_HEAD_ON_PAUSE opt_disable Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN FILAMENT_LOAD_UNLOAD_GCODES PARK_HEAD_ON_PAUSE
exec_test $1 $2 "BigTreeTech SKR 3 EZ | MMU2" "$3" exec_test $1 $2 "BigTreeTech SKR 3 EZ | MMU2" "$3"
@ -71,7 +71,7 @@ opt_set MOTHERBOARD BOARD_BTT_SKR_V3_0_EZ SERIAL_PORT -1 \
Z_STEPPER_ALIGN_XY '{{10,110},{200,110}}' \ Z_STEPPER_ALIGN_XY '{{10,110},{200,110}}' \
Z_STEPPER_ALIGN_ITERATIONS 10 DEFAULT_STEPPER_TIMEOUT_SEC 0 \ Z_STEPPER_ALIGN_ITERATIONS 10 DEFAULT_STEPPER_TIMEOUT_SEC 0 \
SLOWDOWN_DIVISOR 16 SDCARD_CONNECTION ONBOARD BLOCK_BUFFER_SIZE 64 \ SLOWDOWN_DIVISOR 16 SDCARD_CONNECTION ONBOARD BLOCK_BUFFER_SIZE 64 \
CHOPPER_TIMING CHOPPER_DEFAULT_24V MMU2_SERIAL_PORT 2 CHOPPER_TIMING CHOPPER_DEFAULT_24V MMU_SERIAL_PORT 2
opt_enable PIDTEMPBED ENDSTOP_INTERRUPTS_FEATURE S_CURVE_ACCELERATION \ opt_enable PIDTEMPBED ENDSTOP_INTERRUPTS_FEATURE S_CURVE_ACCELERATION \
USE_PROBE_FOR_Z_HOMING BLTOUCH FILAMENT_RUNOUT_SENSOR \ USE_PROBE_FOR_Z_HOMING BLTOUCH FILAMENT_RUNOUT_SENSOR \
AUTO_BED_LEVELING_BILINEAR RESTORE_LEVELING_AFTER_G28 \ AUTO_BED_LEVELING_BILINEAR RESTORE_LEVELING_AFTER_G28 \
@ -86,6 +86,6 @@ opt_enable PIDTEMPBED ENDSTOP_INTERRUPTS_FEATURE S_CURVE_ACCELERATION \
DOUBLECLICK_FOR_Z_BABYSTEPPING BABYSTEP_DISPLAY_TOTAL LIN_ADVANCE \ DOUBLECLICK_FOR_Z_BABYSTEPPING BABYSTEP_DISPLAY_TOTAL LIN_ADVANCE \
BEZIER_CURVE_SUPPORT EMERGENCY_PARSER ADVANCED_PAUSE_FEATURE \ BEZIER_CURVE_SUPPORT EMERGENCY_PARSER ADVANCED_PAUSE_FEATURE \
TMC_DEBUG HOST_ACTION_COMMANDS HOST_PAUSE_M76 HOST_PROMPT_SUPPORT HOST_STATUS_NOTIFICATIONS \ TMC_DEBUG HOST_ACTION_COMMANDS HOST_PAUSE_M76 HOST_PROMPT_SUPPORT HOST_STATUS_NOTIFICATIONS \
MMU_MENUS MMU_SPOOL_JOIN_CONSUMES_ALL_FILAMENT MMU2_DEBUG MMU_MENUS MMU3_SPOOL_JOIN_CONSUMES_ALL_FILAMENT MMU_DEBUG
opt_disable Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN FILAMENT_LOAD_UNLOAD_GCODES PARK_HEAD_ON_PAUSE opt_disable Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN FILAMENT_LOAD_UNLOAD_GCODES PARK_HEAD_ON_PAUSE
exec_test $1 $2 "BigTreeTech SKR 3 EZ | MMU3" "$3" exec_test $1 $2 "BigTreeTech SKR 3 EZ | MMU3" "$3"

View file

@ -79,7 +79,7 @@ exec_test $1 $2 "Rambo heated bed only" "$3"
# #
restore_configs restore_configs
opt_set MOTHERBOARD BOARD_RAMBO EXTRUDERS 5 MMU_MODEL PRUSA_MMU2 opt_set MOTHERBOARD BOARD_RAMBO EXTRUDERS 5 MMU_MODEL PRUSA_MMU2
opt_enable REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER NOZZLE_PARK_FEATURE ADVANCED_PAUSE_FEATURE EMERGENCY_PARSER MMU2_DEBUG opt_enable REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER NOZZLE_PARK_FEATURE ADVANCED_PAUSE_FEATURE EMERGENCY_PARSER MMU_DEBUG
exec_test $1 $2 "Rambo with PRUSA_MMU2 " "$3" exec_test $1 $2 "Rambo with PRUSA_MMU2 " "$3"
# #
@ -87,7 +87,7 @@ exec_test $1 $2 "Rambo with PRUSA_MMU2 " "$3"
# #
restore_configs restore_configs
opt_set MOTHERBOARD BOARD_RAMBO EXTRUDERS 5 MMU_MODEL PRUSA_MMU3 opt_set MOTHERBOARD BOARD_RAMBO EXTRUDERS 5 MMU_MODEL PRUSA_MMU3
opt_enable REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER FILAMENT_RUNOUT_SENSOR NOZZLE_PARK_FEATURE ADVANCED_PAUSE_FEATURE EMERGENCY_PARSER MMU_MENUS MMU2_DEBUG EEPROM_SETTINGS opt_enable REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER FILAMENT_RUNOUT_SENSOR NOZZLE_PARK_FEATURE ADVANCED_PAUSE_FEATURE EMERGENCY_PARSER MMU_MENUS MMU_DEBUG EEPROM_SETTINGS
exec_test $1 $2 "Rambo with PRUSA_MMU3 " "$3" exec_test $1 $2 "Rambo with PRUSA_MMU3 " "$3"
# #