1
0
mirror of https://github.com/MarlinFirmware/Marlin.git synced 2024-11-26 05:17:17 +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_MUX1_PIN 42 // Needed for 3 to 8 inputs
//#define E_MUX2_PIN 44 // Needed for 5 to 8 inputs
#elif HAS_PRUSA_MMU2 || HAS_PRUSA_MMU3
// Common settings for 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
// Use hardware reset for MMU if a pin is defined for it
//#define MMU2_RST_PIN 23
//#define MMU_RST_PIN 23 // Define this pin to use Hardware Reset for MMU2/MMU2S/MMU3
//#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
// Enable if the MMU2 has 12V stepper motors (MMU2 Firmware 1.0.2 and up)
//#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
#define MMU2_FILAMENT_RUNOUT_SCRIPT "M600"
#endif
// Add an LCD menu for MMU2/MMU2S/MMU3
//#define MMU_MENUS
// MMU2 sequences use mm/min. Not compatible with MMU3, which use mm/sec.
#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.
// This is for Průša MK3-style extruders. Customize for your hardware.
#define MMU2_FILAMENTCHANGE_EJECT_FEED 80.0
#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 }
#endif // HAS_PRUSA_MMU2
/**
* ------------
* MMU2 / 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.
* Options pertaining to MMU2S devices
* Requires the 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
*/
#if HAS_PRUSA_MMU2S
@ -4532,14 +4495,9 @@
// 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
// 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
#define MMU3_MAX_RETRIES 3 // Number of retries (total time = timeout*retries)
// As discussed with our PrusaSlicer profile specialist
// - 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)
// 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.
#define MMU2_FILAMENT_SENSOR_POSITION 0 // (mm)
#define MMU2_LOAD_DISTANCE_PAST_GEARS 5 // (mm)
#define MMU2_TOOL_CHANGE_LOAD_LENGTH MMU2_FILAMENT_SENSOR_POSITION + MMU2_LOAD_DISTANCE_PAST_GEARS // (mm)
#define MMU3_FILAMENT_SENSOR_E_POSITION 0 // (mm)
#define _MMU3_LOAD_DISTANCE_PAST_GEARS 5 // (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 MMU2_UNLOAD_TO_FINDA_FEED_RATE 120.0 // (mm/s)
#define MMU3_LOAD_TO_NOZZLE_FEED_RATE 20.0 // (mm/s)
#define MMU2_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_FEED_RATE 50.0 // (mm/s)
#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.
// Meanwhile the E-motor will unload 20mm of filament in about 1 second.
#define MMU2_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_LENGTH 80.0 // (mm)
#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
// then retract to the original position. This is used to check if the filament sensor
// 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_HAS_CUTTER // Enable cutter related functionalities
//#define MMU_FORCE_STEALTH_MODE // Force stealth mode and disable menu item
#define _MMU_EXTRUDER_PTFE_LENGTH 42.3 // (mm)
#define _MMU_EXTRUDER_HEATBREAK_LENGTH 17.7 // (mm)
#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)
/**
* SpoolJoin Consumes All Filament -- EXPERIMENTAL
@ -4587,12 +4543,37 @@
* sensor is triggered through the gears) and the end of the PTFE tube and
* 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
* 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.
* If all attempts fail, a filament runout will be triggered.
*/
//#define MMU_EXTRUDER_SENSOR
#if ENABLED(MMU_EXTRUDER_SENSOR)
#define MMU_LOADING_ATTEMPTS_NR 5 // max. number of attempts to load filament if first load fail
//#define MMU2_EXTRUDER_SENSOR
#if ENABLED(MMU2_EXTRUDER_SENSOR)
#define MMU2_LOADING_ATTEMPTS_NR 5 // Number of times to try loading filament before failure
#endif
#endif
//#define MMU2_DEBUG // Write debug info to serial output
#endif // HAS_PRUSA_MMU2 || HAS_PRUSA_MMU3
/**

View File

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

View File

@ -601,20 +601,20 @@ MSerialT1 customizedSerial1(MSerialT1::HasEmergencyParser);
#endif // SERIAL_PORT_3
#ifdef MMU2_SERIAL_PORT
#ifdef MMU_SERIAL_PORT
ISR(SERIAL_REGNAME(USART, MMU2_SERIAL_PORT, _RX_vect)) {
MarlinSerial<MMU2SerialCfg<MMU2_SERIAL_PORT>>::store_rxd_char();
ISR(SERIAL_REGNAME(USART, MMU_SERIAL_PORT, _RX_vect)) {
MarlinSerial<MMU2SerialCfg<MMU_SERIAL_PORT>>::store_rxd_char();
}
ISR(SERIAL_REGNAME(USART, MMU2_SERIAL_PORT, _UDRE_vect)) {
MarlinSerial<MMU2SerialCfg<MMU2_SERIAL_PORT>>::_tx_udr_empty_irq();
ISR(SERIAL_REGNAME(USART, MMU_SERIAL_PORT, _UDRE_vect)) {
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);
#endif // MMU2_SERIAL_PORT
#endif // MMU_SERIAL_PORT
#ifdef LCD_SERIAL_PORT

View File

@ -246,7 +246,7 @@
#endif // !USBCON
#ifdef MMU2_SERIAL_PORT
#ifdef MMU_SERIAL_PORT
template <uint8_t serial>
struct MMU2SerialCfg {
static constexpr int PORT = serial;
@ -260,7 +260,7 @@
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;
#endif

View File

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

View File

@ -82,13 +82,13 @@ extern DefaultSerial1 USBSerial;
#endif
#endif
#ifdef MMU2_SERIAL_PORT
#if MMU2_SERIAL_PORT == -1
#define MMU2_SERIAL USBSerial
#elif WITHIN(MMU2_SERIAL_PORT, 0, 3)
#define MMU2_SERIAL MSERIAL(MMU2_SERIAL_PORT)
#ifdef MMU_SERIAL_PORT
#if MMU_SERIAL_PORT == -1
#define MMU_SERIAL USBSerial
#elif WITHIN(MMU_SERIAL_PORT, 0, 3)
#define MMU_SERIAL MSERIAL(MMU_SERIAL_PORT)
#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

View File

@ -87,11 +87,11 @@ extern MSerialT serial_stream_3;
#endif
#endif
#ifdef MMU2_SERIAL_PORT
#if WITHIN(MMU2_SERIAL_PORT, 0, 3)
#define MMU2_SERIAL MSERIAL(MMU2_SERIAL_PORT)
#ifdef MMU_SERIAL_PORT
#if WITHIN(MMU_SERIAL_PORT, 0, 3)
#define MMU_SERIAL MSERIAL(MMU_SERIAL_PORT)
#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

View File

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

View File

@ -79,13 +79,13 @@
#endif
#endif
#ifdef MMU2_SERIAL_PORT
#if MMU2_SERIAL_PORT == -1
#define MMU2_SERIAL MSerial0
#elif WITHIN(MMU2_SERIAL_PORT, 0, 3)
#define MMU2_SERIAL MSERIAL(MMU2_SERIAL_PORT)
#ifdef MMU_SERIAL_PORT
#if MMU_SERIAL_PORT == -1
#define MMU_SERIAL MSerial0
#elif WITHIN(MMU_SERIAL_PORT, 0, 3)
#define MMU_SERIAL MSERIAL(MMU_SERIAL_PORT)
#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

View File

@ -90,15 +90,15 @@
#endif
#endif
#ifdef MMU2_SERIAL_PORT
#if WITHIN(MMU2_SERIAL_PORT, 1, 9)
#define MMU2_SERIAL MSERIAL(MMU2_SERIAL_PORT)
#ifdef MMU_SERIAL_PORT
#if WITHIN(MMU_SERIAL_PORT, 1, 9)
#define MMU_SERIAL MSERIAL(MMU_SERIAL_PORT)
#elif !defined(USBCON)
#error "MMU2_SERIAL_PORT must be from 1 to 9."
#elif MMU2_SERIAL_PORT == -1
#define MMU2_SERIAL MSerialUSB
#error "MMU_SERIAL_PORT must be from 1 to 9."
#elif MMU_SERIAL_PORT == -1
#define MMU_SERIAL MSerialUSB
#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

View File

@ -118,14 +118,14 @@
#endif
#endif
#ifdef MMU2_SERIAL_PORT
#if MMU2_SERIAL_PORT == -1
#define MMU2_SERIAL UsbSerial
#elif WITHIN(MMU2_SERIAL_PORT, 1, NUM_UARTS)
#define MMU2_SERIAL MSERIAL(MMU2_SERIAL_PORT)
#ifdef MMU_SERIAL_PORT
#if MMU_SERIAL_PORT == -1
#define MMU_SERIAL UsbSerial
#elif WITHIN(MMU_SERIAL_PORT, 1, NUM_UARTS)
#define MMU_SERIAL MSERIAL(MMU_SERIAL_PORT)
#else
#define MMU2_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.")
#define MMU_SERIAL MSERIAL(1) // dummy port
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

View File

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

View File

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

View File

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

View File

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

View File

@ -28,15 +28,15 @@
#if HAS_PRUSA_MMU3
#include "mmu2.h"
#include "mmu2_error_converter.h"
#include "mmu2_fsensor.h"
#include "mmu2_log.h"
#include "mmu2_marlin.h"
#include "mmu2_marlin_macros.h"
#include "mmu2_power.h"
#include "mmu2_progress_converter.h"
#include "mmu2_reporting.h"
#include "mmu3.h"
#include "mmu3_error_converter.h"
#include "mmu3_fsensor.h"
#include "mmu3_log.h"
#include "mmu3_marlin.h"
#include "mmu3_marlin_macros.h"
#include "mmu3_power.h"
#include "mmu3_progress_converter.h"
#include "mmu3_reporting.h"
#include "strlen_cx.h"
#include "SpoolJoin.h"
@ -91,7 +91,7 @@ namespace MMU3 {
int MMU3::mmu_hw_enabled_addr; // Initialized by settings.load
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)
, tool_change_extruder(MMU2_NO_TOOL)
, resume_position()
@ -121,10 +121,10 @@ namespace MMU3 {
settings.save();
#endif
MMU2_SERIAL.begin(MMU_BAUD);
MMU_SERIAL.begin(MMU_BAUD);
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);
_state = xState::Connecting;
@ -153,7 +153,7 @@ namespace MMU3 {
_state = xState::Stopped;
logic.stop();
MMU2_SERIAL.end();
MMU_SERIAL.end();
}
void MMU3::tune() {
@ -279,14 +279,14 @@ namespace MMU3 {
&& TERN1(HAS_LEVELING, planner.leveling_active)
&& xy_are_trusted()
&& 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
&& !FILAMENT_PRESENT() // so the filament is totally consumed
#endif
) {
SERIAL_ECHOLN_P("FINDA filament runout!");
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
extruder = MMU2_NO_TOOL;
// 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.enabled = false;
#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 {
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
// 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);
/**
@ -378,7 +378,7 @@ namespace MMU3 {
// 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.
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()) {
filament_inserted = filament_inserted && (WhereIsFilament() == FilamentState::AT_FSENSOR);
tlur.Progress(filament_inserted);
@ -392,7 +392,7 @@ namespace MMU3 {
}
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;
for (;;) {
for (;;) {
@ -419,9 +419,9 @@ namespace MMU3 {
// Prepare a retry attempt
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
retries = 0; // reset retries every MMU2_MAX_RETRIES
retries = 0; // reset retries every MMU3_MAX_RETRIES
}
++retries;
@ -1013,7 +1013,7 @@ namespace MMU3 {
void MMU3::execute_load_to_nozzle_sequence() {
planner_synchronize();
// 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]));
}
@ -1120,7 +1120,7 @@ namespace MMU3 {
}
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) {

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -28,8 +28,8 @@
#if HAS_PRUSA_MMU3
#include "mmu2.h"
#include "mmu2_power.h"
#include "mmu3.h"
#include "mmu3_power.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.
void power_on() {
#if PIN_EXISTS(MMU2_RST)
OUT_WRITE(MMU2_RST_PIN, HIGH);
#if PIN_EXISTS(MMU_RST)
OUT_WRITE(MMU_RST_PIN, HIGH);
#endif
power_reset();
}
@ -50,10 +50,10 @@ void power_on() {
void power_off() {}
void power_reset() {
#if PIN_EXISTS(MMU2_RST) // HW - pulse reset pin
WRITE(MMU2_RST_PIN, LOW);
#if PIN_EXISTS(MMU_RST) // HW - pulse reset pin
WRITE(MMU_RST_PIN, LOW);
safe_delay(100);
WRITE(MMU2_RST_PIN, HIGH);
WRITE(MMU_RST_PIN, HIGH);
#else
mmu3.reset(MMU3::Software); // TODO: Needs redesign. This power implementation shouldn't know anything about the MMU itself
#endif

View File

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

View File

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

View File

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

View File

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

View File

@ -35,7 +35,7 @@
#include "mmu_hw/progress_codes.h"
#include "mmu_hw/buttons.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
namespace std {
@ -59,7 +59,7 @@
// Prevent ARM HAL macros from breaking our code
#undef CRC
#include "mmu2_protocol.h"
#include "mmu3_protocol.h"
#include "mmu_hw/buttons.h"
#include "registers.h"

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -26,8 +26,8 @@
#include "../../gcode.h"
#include "../../../module/settings.h"
#include "../../../feature/mmu3/mmu2.h"
#include "../../../feature/mmu3/mmu2_reporting.h"
#include "../../../feature/mmu3/mmu3.h"
#include "../../../feature/mmu3/mmu3_reporting.h"
#include "../../../feature/mmu3/SpoolJoin.h"
// 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 705: mmu3.eject_filament(mmuSlotIndex, false); break;
case 706:
#if ENABLED(MMU_HAS_CUTTER)
#if ENABLED(MMU3_HAS_CUTTER)
if (mmu3.cutter_mode > 0) mmu3.cut_filament(mmuSlotIndex);
#endif
break;
@ -187,7 +187,7 @@ void GcodeSuite::MMU3_report(const bool forReplay/*=true*/) {
report_heading(forReplay, F("MMU3 Operational Stats"));
SERIAL_ECHOPGM(" MMU "); serialprintln_onoff(mmu3.mmu_hw_enabled);
SERIAL_ECHOPGM(" Stealth Mode "); serialprintln_onoff(mmu3.stealth_mode);
#if ENABLED(MMU_HAS_CUTTER)
#if ENABLED(MMU3_HAS_CUTTER)
SERIAL_ECHOPGM(" Cutter ");
serialprintln_onoff(mmu3.cutter_mode != 0);
#endif

View File

@ -468,7 +468,7 @@
#elif defined(ANYCUBIC_LCD_SERIAL_PORT)
#error "ANYCUBIC_LCD_SERIAL_PORT is now LCD_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)
#error "[XYZ]_DUAL_ENDSTOPS_ADJUSTMENT is now [XYZ]2_ENDSTOP_ADJUSTMENT."
#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."
#elif defined(MMU2_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)
#error "FTM_SHAPING_DEFAULT_[XY]_FREQ is now FTM_SHAPING_DEFAULT_FREQ_[XY]."
#endif

View File

@ -1851,7 +1851,7 @@
#define SERIAL_IN_USE(N) ( (defined(SERIAL_PORT) && N == SERIAL_PORT) \
|| (defined(SERIAL_PORT_2) && N == SERIAL_PORT_2) \
|| (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(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."
#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."
#elif ENABLED(MMU_EXTRUDER_SENSOR) && DISABLED(FILAMENT_RUNOUT_SENSOR)
#error "MMU_EXTRUDER_SENSOR requires FILAMENT_RUNOUT_SENSOR. Enable it to continue."
#elif ENABLED(MMU_EXTRUDER_SENSOR) && !HAS_MARLINUI_MENU
#error "MMU_EXTRUDER_SENSOR requires an LCD supporting MarlinUI."
#elif ENABLED(MMU2_EXTRUDER_SENSOR) && DISABLED(FILAMENT_RUNOUT_SENSOR)
#error "MMU2_EXTRUDER_SENSOR requires FILAMENT_RUNOUT_SENSOR. Enable it to continue."
#elif ENABLED(MMU2_EXTRUDER_SENSOR) && !HAS_MARLINUI_MENU
#error "MMU2_EXTRUDER_SENSOR requires an LCD supporting MarlinUI."
#elif ENABLED(MMU_MENUS) && !HAS_MARLINUI_MENU
#error "MMU_MENUS requires an LCD supporting MarlinUI."
#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)
#error "MMU3 requires EEPROM_SETTINGS."
#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
@ -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."
#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."
#elif MMU2_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."
#elif MMU_SERIAL_PORT == -1
#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
#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
@ -2954,15 +2954,15 @@ static_assert(NUM_SERVOS <= NUM_SERVO_PLUGS, "NUM_SERVOS (or some servo index) i
/**
* MMU2 require a dedicated serial port
*/
#ifdef MMU2_SERIAL_PORT
#if MMU2_SERIAL_PORT == SERIAL_PORT
#error "MMU2_SERIAL_PORT cannot be the same as SERIAL_PORT."
#elif defined(SERIAL_PORT_2) && MMU2_SERIAL_PORT == SERIAL_PORT_2
#error "MMU2_SERIAL_PORT cannot be the same as SERIAL_PORT_2."
#elif defined(LCD_SERIAL_PORT) && MMU2_SERIAL_PORT == LCD_SERIAL_PORT
#error "MMU2_SERIAL_PORT cannot be the same as LCD_SERIAL_PORT."
#elif defined(RS485_SERIAL_PORT) && MMU2_SERIAL_PORT == RS485_SERIAL_PORT
#error "MMU2_SERIAL_PORT cannot be the same as RS485_SERIAL_PORT."
#ifdef MMU_SERIAL_PORT
#if MMU_SERIAL_PORT == SERIAL_PORT
#error "MMU_SERIAL_PORT cannot be the same as SERIAL_PORT."
#elif defined(SERIAL_PORT_2) && MMU_SERIAL_PORT == SERIAL_PORT_2
#error "MMU_SERIAL_PORT cannot be the same as SERIAL_PORT_2."
#elif defined(LCD_SERIAL_PORT) && MMU_SERIAL_PORT == LCD_SERIAL_PORT
#error "MMU_SERIAL_PORT cannot be the same as LCD_SERIAL_PORT."
#elif defined(RS485_SERIAL_PORT) && MMU_SERIAL_PORT == RS485_SERIAL_PORT
#error "MMU_SERIAL_PORT cannot be the same as RS485_SERIAL_PORT."
#endif
#endif

View File

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

View File

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

View File

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

View File

@ -2180,8 +2180,8 @@
//
// MMU2
//
#if PIN_EXISTS(MMU2_RST)
REPORT_NAME_DIGITAL(__LINE__, MMU2_RST_PIN)
#if PIN_EXISTS(MMU_RST)
REPORT_NAME_DIGITAL(__LINE__, MMU_RST_PIN)
#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
# 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.
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
# 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_ITERATIONS 10 DEFAULT_STEPPER_TIMEOUT_SEC 0 \
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 \
USE_PROBE_FOR_Z_HOMING BLTOUCH FILAMENT_RUNOUT_SENSOR \
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 \
BEZIER_CURVE_SUPPORT EMERGENCY_PARSER ADVANCED_PAUSE_FEATURE \
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 \
PARK_HEAD_ON_PAUSE
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_ITERATIONS 10 DEFAULT_STEPPER_TIMEOUT_SEC 0 \
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
opt_enable PIDTEMPBED S_CURVE_ACCELERATION \
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 \
BEZIER_CURVE_SUPPORT EMERGENCY_PARSER ADVANCED_PAUSE_FEATURE \
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
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_ITERATIONS 10 DEFAULT_STEPPER_TIMEOUT_SEC 0 \
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 \
USE_PROBE_FOR_Z_HOMING BLTOUCH FILAMENT_RUNOUT_SENSOR \
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 \
BEZIER_CURVE_SUPPORT EMERGENCY_PARSER ADVANCED_PAUSE_FEATURE \
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
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_ITERATIONS 10 DEFAULT_STEPPER_TIMEOUT_SEC 0 \
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 \
USE_PROBE_FOR_Z_HOMING BLTOUCH FILAMENT_RUNOUT_SENSOR \
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 \
BEZIER_CURVE_SUPPORT EMERGENCY_PARSER ADVANCED_PAUSE_FEATURE \
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
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
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"
#
@ -87,7 +87,7 @@ exec_test $1 $2 "Rambo with PRUSA_MMU2 " "$3"
#
restore_configs
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"
#