Towards MMU2 without LCD

This commit is contained in:
Scott Lahteine 2020-10-28 00:26:27 -05:00
parent ca34edc5b0
commit 47ad2caab2
3 changed files with 178 additions and 181 deletions

View file

@ -105,23 +105,19 @@ int16_t MMU2::version = -1, MMU2::buildnr = -1;
millis_t MMU2::prev_request, MMU2::prev_P0_request; millis_t MMU2::prev_request, MMU2::prev_P0_request;
char MMU2::rx_buffer[MMU_RX_SIZE], MMU2::tx_buffer[MMU_TX_SIZE]; char MMU2::rx_buffer[MMU_RX_SIZE], MMU2::tx_buffer[MMU_TX_SIZE];
#if BOTH(HAS_LCD_MENU, MMU2_MENUS) struct E_Step {
struct E_Step {
float extrude; //!< extrude distance in mm float extrude; //!< extrude distance in mm
feedRate_t feedRate; //!< feed rate in mm/s feedRate_t feedRate; //!< feed rate in mm/s
}; };
static constexpr E_Step static constexpr E_Step
ramming_sequence[] PROGMEM = { MMU2_RAMMING_SEQUENCE } ramming_sequence[] PROGMEM = { MMU2_RAMMING_SEQUENCE }
, load_to_nozzle_sequence[] PROGMEM = { MMU2_LOAD_TO_NOZZLE_SEQUENCE } , load_to_nozzle_sequence[] PROGMEM = { MMU2_LOAD_TO_NOZZLE_SEQUENCE }
#if HAS_PRUSA_MMU2S #if HAS_PRUSA_MMU2S
, can_load_sequence[] PROGMEM = { MMU2_CAN_LOAD_SEQUENCE } , can_load_sequence[] PROGMEM = { MMU2_CAN_LOAD_SEQUENCE }
, can_load_increment_sequence[] PROGMEM = { MMU2_CAN_LOAD_INCREMENT_SEQUENCE } , can_load_increment_sequence[] PROGMEM = { MMU2_CAN_LOAD_INCREMENT_SEQUENCE }
#endif #endif
; ;
#endif
MMU2::MMU2() { MMU2::MMU2() {
rx_buffer[0] = '\0'; rx_buffer[0] = '\0';
@ -906,22 +902,21 @@ void MMU2::filament_runout() {
DEBUG_ECHOLNPGM(" succeeded."); DEBUG_ECHOLNPGM(" succeeded.");
return true; return true;
} }
#endif #endif
#if BOTH(HAS_LCD_MENU, MMU2_MENUS) // Load filament into MMU2
void MMU2::load_filament(const uint8_t index) {
// Load filament into MMU2
void MMU2::load_filament(const uint8_t index) {
if (!enabled) return; if (!enabled) return;
command(MMU_CMD_L0 + index); command(MMU_CMD_L0 + index);
manage_response(false, false); manage_response(false, false);
BUZZ(200, 404); BUZZ(200, 404);
} }
/** /**
* Switch material and load to nozzle * Switch material and load to nozzle
*/ */
bool MMU2::load_filament_to_nozzle(const uint8_t index) { bool MMU2::load_filament_to_nozzle(const uint8_t index) {
if (!enabled) return false; if (!enabled) return false;
@ -943,21 +938,21 @@ void MMU2::filament_runout() {
BUZZ(200, 404); BUZZ(200, 404);
} }
return success; return success;
} }
/** /**
* Load filament to nozzle of multimaterial printer * Load filament to nozzle of multimaterial printer
* *
* This function is used only only after T? (user select filament) and M600 (change filament). * This function is used only only after T? (user select filament) and M600 (change filament).
* It is not used after T0 .. T4 command (select filament), in such case, gcode is responsible for loading * It is not used after T0 .. T4 command (select filament), in such case, gcode is responsible for loading
* filament to nozzle. * filament to nozzle.
*/ */
void MMU2::load_to_nozzle() { void MMU2::load_to_nozzle() {
if (!enabled) return; if (!enabled) return;
execute_extruder_sequence((const E_Step *)load_to_nozzle_sequence, COUNT(load_to_nozzle_sequence)); execute_extruder_sequence((const E_Step *)load_to_nozzle_sequence, COUNT(load_to_nozzle_sequence));
} }
bool MMU2::eject_filament(const uint8_t index, const bool recover) { bool MMU2::eject_filament(const uint8_t index, const bool recover) {
if (!enabled) return false; if (!enabled) return false;
@ -971,7 +966,7 @@ void MMU2::filament_runout() {
ENABLE_AXIS_E0(); ENABLE_AXIS_E0();
current_position.e -= MMU2_FILAMENTCHANGE_EJECT_FEED; current_position.e -= MMU2_FILAMENTCHANGE_EJECT_FEED;
line_to_current_position(2500 / 60); line_to_current_position(MMM_TO_MMS(2500));
planner.synchronize(); planner.synchronize();
command(MMU_CMD_E0 + index); command(MMU_CMD_E0 + index);
manage_response(false, false); manage_response(false, false);
@ -1001,12 +996,12 @@ void MMU2::filament_runout() {
DISABLE_AXIS_E0(); DISABLE_AXIS_E0();
return true; return true;
} }
/** /**
* Unload from hotend and retract to MMU * Unload from hotend and retract to MMU
*/ */
bool MMU2::unload() { bool MMU2::unload() {
if (!enabled) return false; if (!enabled) return false;
@ -1029,16 +1024,16 @@ void MMU2::filament_runout() {
set_runout_valid(false); set_runout_valid(false);
return true; return true;
} }
/** /**
* Unload sequence to optimize shape of the tip of the unloaded filament * Unload sequence to optimize shape of the tip of the unloaded filament
*/ */
void MMU2::filament_ramming() { void MMU2::filament_ramming() {
execute_extruder_sequence((const E_Step *)ramming_sequence, sizeof(ramming_sequence) / sizeof(E_Step)); execute_extruder_sequence((const E_Step *)ramming_sequence, sizeof(ramming_sequence) / sizeof(E_Step));
} }
void MMU2::execute_extruder_sequence(const E_Step * sequence, int steps) { void MMU2::execute_extruder_sequence(const E_Step * sequence, int steps) {
planner.synchronize(); planner.synchronize();
ENABLE_AXIS_E0(); ENABLE_AXIS_E0();
@ -1060,8 +1055,6 @@ void MMU2::filament_runout() {
} }
DISABLE_AXIS_E0(); DISABLE_AXIS_E0();
} }
#endif // HAS_LCD_MENU && MMU2_MENUS
#endif // HAS_PRUSA_MMU2 #endif // HAS_PRUSA_MMU2

View file

@ -49,13 +49,11 @@ public:
static uint8_t get_current_tool(); static uint8_t get_current_tool();
static void set_filament_type(const uint8_t index, const uint8_t type); static void set_filament_type(const uint8_t index, const uint8_t type);
#if BOTH(HAS_LCD_MENU, MMU2_MENUS)
static bool unload(); static bool unload();
static void load_filament(uint8_t); static void load_filament(uint8_t);
static void load_all(); static void load_all();
static bool load_filament_to_nozzle(const uint8_t index); static bool load_filament_to_nozzle(const uint8_t index);
static bool eject_filament(const uint8_t index, const bool recover); static bool eject_filament(const uint8_t index, const bool recover);
#endif
private: private:
static bool rx_str_P(const char* str); static bool rx_str_P(const char* str);
@ -72,11 +70,9 @@ private:
static bool get_response(); static bool get_response();
static void manage_response(const bool move_axes, const bool turn_off_nozzle); static void manage_response(const bool move_axes, const bool turn_off_nozzle);
#if BOTH(HAS_LCD_MENU, MMU2_MENUS)
static void load_to_nozzle(); static void load_to_nozzle();
static void filament_ramming(); static void filament_ramming();
static void execute_extruder_sequence(const E_Step * sequence, int steps); static void execute_extruder_sequence(const E_Step * sequence, int steps);
#endif
static void filament_runout(); static void filament_runout();

View file

@ -874,6 +874,31 @@ static_assert(Y_MAX_LENGTH >= Y_BED_SIZE, "Movement bounds (Y_MIN_POS, Y_MAX_POS
#error "INDIVIDUAL_AXIS_HOMING_MENU is incompatible with DELTA kinematics." #error "INDIVIDUAL_AXIS_HOMING_MENU is incompatible with DELTA kinematics."
#endif #endif
/**
* Multi-Material-Unit requirements
*/
#if HAS_PRUSA_MMU2
#if EXTRUDERS != 5
#undef SINGLENOZZLE
#error "PRUSA_MMU2(S) requires exactly 5 EXTRUDERS. Please update your Configuration."
#elif DISABLED(NOZZLE_PARK_FEATURE)
#error "PRUSA_MMU2(S) requires NOZZLE_PARK_FEATURE. Enable it to continue."
#elif ENABLED(HAS_PRUSA_MMU2S) && DISABLED(FILAMENT_RUNOUT_SENSOR)
#error "PRUSA_MMU2S 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 HAS_PRUSA_MMU2S && !HAS_LCD_MENU
#error "PRUSA_MMU2S requires an LCD supporting MarlinUI to be enabled."
#elif ENABLED(MMU_EXTRUDER_SENSOR) && !HAS_LCD_MENU
#error "MMU_EXTRUDER_SENSOR requires an LCD supporting MarlinUI to be enabled."
#elif DISABLED(ADVANCED_PAUSE_FEATURE)
static_assert(nullptr == strstr(MMU2_FILAMENT_RUNOUT_SCRIPT, "M600"), "ADVANCED_PAUSE_FEATURE is required to use M600 with PRUSA_MMU2(S) / SMUFF_EMU_MMU2(S).");
#endif
#endif
#if HAS_SMUFF && EXTRUDERS > 15
#error "Too many extruders for SMUFF_EMU_MMU2(S). (15 maximum)."
#endif
/** /**
* Options only for EXTRUDERS > 1 * Options only for EXTRUDERS > 1
*/ */
@ -2958,23 +2983,6 @@ static_assert( _ARR_TEST(3,0) && _ARR_TEST(3,1) && _ARR_TEST(3,2)
#endif #endif
#endif #endif
/**
* Multi-Material-Unit requirements
*/
#if HAS_SMUFF && EXTRUDERS > 15
#error "Too many extruders for SMUFF_EMU_MMU2(S). (15 maximum)."
#elif HAS_PRUSA_MMU2
#if EXTRUDERS != 5
#error "PRUSA_MMU2 / PRUSA_MMU2S requires EXTRUDERS = 5."
#elif DISABLED(NOZZLE_PARK_FEATURE)
#error "PRUSA_MMU2 / PRUSA_MMU2S requires NOZZLE_PARK_FEATURE. Enable it to continue."
#elif EITHER(HAS_PRUSA_MMU2S, MMU_EXTRUDER_SENSOR) && DISABLED(FILAMENT_RUNOUT_SENSOR)
#error "PRUSA_MMU2S or MMU_EXTRUDER_SENSOR requires FILAMENT_RUNOUT_SENSOR. Enable it to continue."
#elif DISABLED(ADVANCED_PAUSE_FEATURE)
static_assert(nullptr == strstr(MMU2_FILAMENT_RUNOUT_SCRIPT, "M600"), "ADVANCED_PAUSE_FEATURE is required to use M600 with PRUSA_MMU2(S) / SMUFF_EMU_MMU2(S).");
#endif
#endif
/** /**
* Advanced PRINTCOUNTER settings * Advanced PRINTCOUNTER settings
*/ */