From 0e75a03c8c6203834d77bc775ac95bc1292af1af Mon Sep 17 00:00:00 2001 From: "D.R.racer" Date: Tue, 31 May 2022 09:20:51 +0200 Subject: [PATCH] Reuse FSensor runout blocking impl. throughout the whole FW --- Firmware/Filament_sensor.cpp | 24 +++++- Firmware/Filament_sensor.h | 9 ++ Firmware/Marlin_main.cpp | 157 +++++++++++++++-------------------- Firmware/mmu2.cpp | 6 +- Firmware/mmu2_fsensor.cpp | 17 ---- Firmware/mmu2_fsensor.h | 9 +- Firmware/ultralcd.cpp | 17 +--- 7 files changed, 104 insertions(+), 135 deletions(-) diff --git a/Firmware/Filament_sensor.cpp b/Firmware/Filament_sensor.cpp index 9c87b27df..ab9c81228 100644 --- a/Firmware/Filament_sensor.cpp +++ b/Firmware/Filament_sensor.cpp @@ -11,13 +11,29 @@ #include "ultralcd.h" #ifdef FILAMENT_SENSOR -#if FILAMENT_SENSOR_TYPE == FSENSOR_IR +FSensorBlockRunout::FSensorBlockRunout() { + fsensor.setRunoutEnabled(false); //suppress filament runouts while loading filament. + fsensor.setAutoLoadEnabled(false); //suppress filament autoloads while loading filament. +#if (FILAMENT_SENSOR_TYPE == FSENSOR_PAT9125) + fsensor.setJamDetectionEnabled(false); //suppress filament jam detection while loading filament. +#endif //(FILAMENT_SENSOR_TYPE == FSENSOR_PAT9125) +} + +FSensorBlockRunout::~FSensorBlockRunout() { + fsensor.settings_init(); // restore filament runout state. +} + +# if FILAMENT_SENSOR_TYPE == FSENSOR_IR IR_sensor fsensor; -#elif FILAMENT_SENSOR_TYPE == FSENSOR_IR_ANALOG +# elif FILAMENT_SENSOR_TYPE == FSENSOR_IR_ANALOG IR_sensor_analog fsensor; -#elif FILAMENT_SENSOR_TYPE == FSENSOR_PAT9125 +# elif FILAMENT_SENSOR_TYPE == FSENSOR_PAT9125 PAT9125_sensor fsensor; -#endif +# endif + +#else // FILAMENT_SENSOR +FSensorBlockRunout::FSensorBlockRunout() { } +FSensorBlockRunout::~FSensorBlockRunout() { } #endif // FILAMENT_SENSOR void Filament_sensor::setEnabled(bool enabled) { diff --git a/Firmware/Filament_sensor.h b/Firmware/Filament_sensor.h index e541e5e25..65cd01732 100644 --- a/Firmware/Filament_sensor.h +++ b/Firmware/Filament_sensor.h @@ -11,6 +11,15 @@ #define FSENSOR_IR_ANALOG 2 #define FSENSOR_PAT9125 3 +/// Can be used to block printer's filament sensor handling - to avoid errorneous injecting of M600 +/// while doing a toolchange with the MMU +/// In case of "no filament sensor" these methods default to an empty implementation +class FSensorBlockRunout { +public: + FSensorBlockRunout(); + ~FSensorBlockRunout(); +}; + #ifdef FILAMENT_SENSOR class Filament_sensor { public: diff --git a/Firmware/Marlin_main.cpp b/Firmware/Marlin_main.cpp index 2046a420d..112e072d8 100644 --- a/Firmware/Marlin_main.cpp +++ b/Firmware/Marlin_main.cpp @@ -3573,101 +3573,86 @@ static void gcode_M600(bool automatic, float x_position, float y_position, float else unload_filament(true); // unload filament for single material (used also in M702) st_synchronize(); // finish moves - -#ifdef FILAMENT_SENSOR - fsensor.setRunoutEnabled(false); //suppress filament runouts while loading filament. - fsensor.setAutoLoadEnabled(false); //suppress filament autoloads while loading filament. -#if (FILAMENT_SENSOR_TYPE == FSENSOR_PAT9125) - fsensor.setJamDetectionEnabled(false); //suppress filament jam detection while loading filament. -#endif //(FILAMENT_SENSOR_TYPE == FSENSOR_PAT9125) -#endif - - if (!MMU2::mmu2.Enabled()) { - KEEPALIVE_STATE(PAUSED_FOR_USER); - lcd_change_fil_state = - lcd_show_fullscreen_message_yes_no_and_wait_P(_i("Was filament unload successful?"), false, LCD_LEFT_BUTTON_CHOICE); ////MSG_UNLOAD_SUCCESSFUL c=20 r=2 - if (lcd_change_fil_state == LCD_MIDDLE_BUTTON_CHOICE) { - lcd_clear(); - lcd_puts_at_P(0, 2, _T(MSG_PLEASE_WAIT)); - current_position[X_AXIS] -= 100; - plan_buffer_line_curposXYZE(FILAMENTCHANGE_XYFEED); - st_synchronize(); - lcd_show_fullscreen_message_and_wait_P(_i("Please open idler and remove filament manually.")); ////MSG_CHECK_IDLER c=20 r=5 - } - } - - if (MMU2::mmu2.Enabled()) { - if (!automatic) { - if (saved_printing){ - // if M600 was invoked by filament senzor (FINDA) eject filament so user can easily remove it - MMU2::mmu2.eject_filament(MMU2::mmu2.get_current_tool(), false); - } - mmu_M600_wait_and_beep(); - if (saved_printing) { + { + FSensorBlockRunout fsBlockRunout; + + if (!MMU2::mmu2.Enabled()) { + KEEPALIVE_STATE(PAUSED_FOR_USER); + lcd_change_fil_state = + lcd_show_fullscreen_message_yes_no_and_wait_P(_i("Was filament unload successful?"), false, LCD_LEFT_BUTTON_CHOICE); ////MSG_UNLOAD_SUCCESSFUL c=20 r=2 + if (lcd_change_fil_state == LCD_MIDDLE_BUTTON_CHOICE) { lcd_clear(); lcd_puts_at_P(0, 2, _T(MSG_PLEASE_WAIT)); -//@@TODO mmu_command(MmuCmd::R0); -// manage_response(false, false); + current_position[X_AXIS] -= 100; + plan_buffer_line_curposXYZE(FILAMENTCHANGE_XYFEED); + st_synchronize(); + lcd_show_fullscreen_message_and_wait_P(_i("Please open idler and remove filament manually.")); ////MSG_CHECK_IDLER c=20 r=5 } } - mmu_M600_load_filament(automatic, HotendTempBckp); - } else - M600_load_filament(); - - if (!automatic) - M600_check_state(HotendTempBckp); - - lcd_update_enable(true); - - // Not let's go back to print - fanSpeed = fanSpeedBckp; - - // Feed a little of filament to stabilize pressure - if (!automatic) { - current_position[E_AXIS] += FILAMENTCHANGE_RECFEED; - plan_buffer_line_curposXYZE(FILAMENTCHANGE_EXFEED); + + if (MMU2::mmu2.Enabled()) { + if (!automatic) { + if (saved_printing){ + // if M600 was invoked by filament senzor (FINDA) eject filament so user can easily remove it + MMU2::mmu2.eject_filament(MMU2::mmu2.get_current_tool(), false); + } + mmu_M600_wait_and_beep(); + if (saved_printing) { + lcd_clear(); + lcd_puts_at_P(0, 2, _T(MSG_PLEASE_WAIT)); +//@@TODO mmu_command(MmuCmd::R0); +// manage_response(false, false); + } + } + mmu_M600_load_filament(automatic, HotendTempBckp); + } else + M600_load_filament(); + + if (!automatic) + M600_check_state(HotendTempBckp); + + lcd_update_enable(true); + + // Not let's go back to print + fanSpeed = fanSpeedBckp; + + // Feed a little of filament to stabilize pressure + if (!automatic) { + current_position[E_AXIS] += FILAMENTCHANGE_RECFEED; + plan_buffer_line_curposXYZE(FILAMENTCHANGE_EXFEED); + } + + // Move XY back + plan_buffer_line(lastpos[X_AXIS], lastpos[Y_AXIS], current_position[Z_AXIS], current_position[E_AXIS], FILAMENTCHANGE_XYFEED, active_extruder); + st_synchronize(); + // Move Z back + plan_buffer_line(lastpos[X_AXIS], lastpos[Y_AXIS], lastpos[Z_AXIS], current_position[E_AXIS], FILAMENTCHANGE_ZFEED, active_extruder); + st_synchronize(); + + // Set E position to original + plan_set_e_position(lastpos[E_AXIS]); + + memcpy(current_position, lastpos, sizeof(lastpos)); + set_destination_to_current(); + + // Recover feed rate + feedmultiply = feedmultiplyBckp; + char cmd[9]; + sprintf_P(cmd, PSTR("M220 S%i"), feedmultiplyBckp); + enquecommand(cmd); + } - - // Move XY back - plan_buffer_line(lastpos[X_AXIS], lastpos[Y_AXIS], current_position[Z_AXIS], current_position[E_AXIS], FILAMENTCHANGE_XYFEED, active_extruder); - st_synchronize(); - // Move Z back - plan_buffer_line(lastpos[X_AXIS], lastpos[Y_AXIS], lastpos[Z_AXIS], current_position[E_AXIS], FILAMENTCHANGE_ZFEED, active_extruder); - st_synchronize(); - - // Set E position to original - plan_set_e_position(lastpos[E_AXIS]); - - memcpy(current_position, lastpos, sizeof(lastpos)); - set_destination_to_current(); - - // Recover feed rate - feedmultiply = feedmultiplyBckp; - char cmd[9]; - sprintf_P(cmd, PSTR("M220 S%i"), feedmultiplyBckp); - enquecommand(cmd); - -#ifdef FILAMENT_SENSOR - fsensor.settings_init(); -#endif - + lcd_setstatuspgm(MSG_WELCOME); custom_message_type = CustomMsg::Status; } void gcode_M701(uint8_t mmuSlotIndex){ printf_P(PSTR("gcode_M701 begin\n")); - -#ifdef FILAMENT_SENSOR - fsensor.setRunoutEnabled(false); // suppress filament runouts while loading filament. - fsensor.setAutoLoadEnabled(false); // suppress filament autoloads while loading filament. -#if (FILAMENT_SENSOR_TYPE == FSENSOR_PAT9125) - fsensor.setJamDetectionEnabled(false); // suppress filament jam detection while loading filament. -#endif //(FILAMENT_SENSOR_TYPE == FSENSOR_PAT9125) -#endif - - prusa_statistics(22); - } + + FSensorBlockRunout fsBlockRunout; + + prusa_statistics(22); if (MMU2::mmu2.Enabled() && mmuSlotIndex < MMU_FILAMENT_COUNT) { MMU2::mmu2.load_filament(mmuSlotIndex); // loads current extruder @@ -3705,10 +3690,6 @@ void gcode_M701(uint8_t mmuSlotIndex){ } eFilamentAction = FilamentAction::None; - -#ifdef FILAMENT_SENSOR - fsensor.settings_init(); // restore filament runout state. -#endif } /** * @brief Get serial number from 32U2 processor diff --git a/Firmware/mmu2.cpp b/Firmware/mmu2.cpp index 7f4ab5b05..31e825ba4 100644 --- a/Firmware/mmu2.cpp +++ b/Firmware/mmu2.cpp @@ -198,7 +198,7 @@ bool MMU2::tool_change(uint8_t index) { if (index != extruder) { ReportingRAII rep(CommandInProgress::ToolChange); - BlockRunoutRAII blockRunout; + FSensorBlockRunout blockRunout; st_synchronize(); @@ -227,7 +227,7 @@ bool MMU2::tool_change(char code, uint8_t slot) { if( ! WaitForMMUReady()) return false; - BlockRunoutRAII blockRunout; + FSensorBlockRunout blockRunout; switch (code) { case '?': { @@ -333,7 +333,7 @@ bool MMU2::load_filament_to_nozzle(uint8_t index) { { // used for MMU-menu operation "Load to Nozzle" ReportingRAII rep(CommandInProgress::ToolChange); - BlockRunoutRAII blockRunout; + FSensorBlockRunout blockRunout; if( extruder != MMU2_NO_TOOL ){ // we already have some filament loaded - free it + shape its tip properly filament_ramming(); diff --git a/Firmware/mmu2_fsensor.cpp b/Firmware/mmu2_fsensor.cpp index 48fe639a9..eee1b68bd 100644 --- a/Firmware/mmu2_fsensor.cpp +++ b/Firmware/mmu2_fsensor.cpp @@ -7,21 +7,4 @@ FilamentState WhereIsFilament(){ return fsensor.getFilamentPresent() ? FilamentState::AT_FSENSOR : FilamentState::NOT_PRESENT; } - -BlockRunoutRAII::BlockRunoutRAII() { -#ifdef FILAMENT_SENSOR - fsensor.setRunoutEnabled(false); //suppress filament runouts while loading filament. - fsensor.setAutoLoadEnabled(false); //suppress filament autoloads while loading filament. -#if (FILAMENT_SENSOR_TYPE == FSENSOR_PAT9125) - fsensor.setJamDetectionEnabled(false); //suppress filament jam detection while loading filament. -#endif //(FILAMENT_SENSOR_TYPE == FSENSOR_PAT9125) -#endif -} - -BlockRunoutRAII::~BlockRunoutRAII() { -#ifdef FILAMENT_SENSOR - fsensor.settings_init(); // restore filament runout state. -#endif -} - } // namespace MMU2 diff --git a/Firmware/mmu2_fsensor.h b/Firmware/mmu2_fsensor.h index 9450c206c..5135aedf1 100644 --- a/Firmware/mmu2_fsensor.h +++ b/Firmware/mmu2_fsensor.h @@ -1,5 +1,6 @@ #pragma once #include +#include "Filament_sensor.h" namespace MMU2 { @@ -13,12 +14,4 @@ enum class FilamentState : uint_fast8_t { FilamentState WhereIsFilament(); -/// Can be used to block printer's filament sensor handling - to avoid errorneous injecting of M600 -/// while doing a toolchange with the MMU -class BlockRunoutRAII { -public: - BlockRunoutRAII(); - ~BlockRunoutRAII(); -}; - } // namespace MMU2 diff --git a/Firmware/ultralcd.cpp b/Firmware/ultralcd.cpp index edd864aef..035187d1f 100755 --- a/Firmware/ultralcd.cpp +++ b/Firmware/ultralcd.cpp @@ -5196,14 +5196,7 @@ void unload_filament(bool automatic) custom_message_type = CustomMsg::FilamentLoading; lcd_setstatuspgm(_T(MSG_UNLOADING_FILAMENT)); -#ifdef FILAMENT_SENSOR - fsensor.setRunoutEnabled(false); //suppress filament runouts while loading filament. - fsensor.setAutoLoadEnabled(false); //suppress filament autoloads while loading filament. -#if (FILAMENT_SENSOR_TYPE == FSENSOR_PAT9125) - fsensor.setJamDetectionEnabled(false); //suppress filament jam detection while loading filament. -#endif //(FILAMENT_SENSOR_TYPE == FSENSOR_PAT9125) -#endif - + FSensorBlockRunout fsBlockRunout; raise_z_above(automatic? MIN_Z_FOR_SWAP: MIN_Z_FOR_UNLOAD); // extr_unload2(); @@ -5241,10 +5234,6 @@ void unload_filament(bool automatic) custom_message_type = CustomMsg::Status; eFilamentAction = FilamentAction::None; - -#ifdef FILAMENT_SENSOR - fsensor.settings_init(); //restore filament runout state. -#endif } #include "xflash.h" @@ -6209,8 +6198,7 @@ void printf_IRSensorAnalogBoardChange(){ static bool lcd_selftest_IRsensor(bool bStandalone) { bool ret = false; - fsensor.setAutoLoadEnabled(false); - fsensor.setRunoutEnabled(false); + FSensorBlockRunout fsBlockRunout; IR_sensor_analog::SensorRevision oldSensorRevision = fsensor.getSensorRevision(); IR_sensor_analog::SensorRevision newSensorRevision; uint16_t volt_IR_int = fsensor.getVoltRaw(); @@ -6236,7 +6224,6 @@ static bool lcd_selftest_IRsensor(bool bStandalone) } ret = true; exit: - fsensor.settings_init(); return ret; }