From 7c91459c371f85aa1a38f74fa1b9268c43d74959 Mon Sep 17 00:00:00 2001 From: Ian Bassi Date: Tue, 30 Dec 2025 13:16:47 -0300 Subject: [PATCH] Emit Disable Power Loss Recovery (#11616) * Emit Disable Power Loss Recovery Now only works if it's enabled but the goal it's to force disable it. With this change it will always emit the command for BBL or Marlin 2. Co-Authored-By: Michael Rook <54159303+michaelr0@users.noreply.github.com> * Refactor power loss recovery G-code comments * Return empty power loss recovery when no compatible printer * Update power loss recovery comments Update label and tooltip for power loss recovery * Add enum for power loss recovery mode Refactored power loss recovery configuration to use a new PowerLossRecoveryMode enum instead of a boolean. Updated GCodeWriter and related logic to handle the new enum, allowing for 'printer_configuration', 'enable', and 'disable' options. Updated config handling, legacy value conversion, and default values accordingly. * Update PrintConfig.cpp --------- Co-authored-by: Michael Rook <54159303+michaelr0@users.noreply.github.com> Co-authored-by: SoftFever --- .../BBL/machine/fdm_machine_common.json | 2 +- src/libslic3r/GCode.cpp | 20 ++++++------- src/libslic3r/GCodeWriter.cpp | 21 ++++++++----- src/libslic3r/GCodeWriter.hpp | 2 +- src/libslic3r/PrintConfig.cpp | 30 ++++++++++++++++--- src/libslic3r/PrintConfig.hpp | 10 ++++++- 6 files changed, 60 insertions(+), 25 deletions(-) diff --git a/resources/profiles/BBL/machine/fdm_machine_common.json b/resources/profiles/BBL/machine/fdm_machine_common.json index 0073ac6a8a..566d3960ed 100644 --- a/resources/profiles/BBL/machine/fdm_machine_common.json +++ b/resources/profiles/BBL/machine/fdm_machine_common.json @@ -136,7 +136,7 @@ "60" ], "scan_first_layer": "0", - "enable_power_loss_recovery": "1", + "enable_power_loss_recovery": "printer_configuration", "silent_mode": "0", "single_extruder_multi_material": "1", "support_air_filtration": "0", diff --git a/src/libslic3r/GCode.cpp b/src/libslic3r/GCode.cpp index 707dadd9f9..0e07e3fdb8 100644 --- a/src/libslic3r/GCode.cpp +++ b/src/libslic3r/GCode.cpp @@ -3084,10 +3084,11 @@ void GCode::_do_export(Print& print, GCodeOutputStream &file, ThumbnailsGenerato m_sorted_layer_filaments.emplace_back(lt.extruders); } - // Orca: finish tracking power lost recovery + // Orca: disable power loss recovery if it was enabled earlier { - if (m_second_layer_things_done && print.config().enable_power_loss_recovery.value == true) { - file.write(m_writer.enable_power_loss_recovery(false)); + const auto plr_mode = print.config().enable_power_loss_recovery.value; + if (m_second_layer_things_done && plr_mode == PowerLossRecoveryMode::Enable) { + file.write(m_writer.enable_power_loss_recovery(PowerLossRecoveryMode::Disable)); } } ++ finished_objects; @@ -3165,9 +3166,9 @@ void GCode::_do_export(Print& print, GCodeOutputStream &file, ThumbnailsGenerato m_sorted_layer_filaments.emplace_back(lt.extruders); } - // Orca: finish tracking power lost recovery - if (m_second_layer_things_done && print.config().enable_power_loss_recovery.value == true) { - file.write(m_writer.enable_power_loss_recovery(false)); + // Orca: disable power loss recovery + if (m_second_layer_things_done && print.config().enable_power_loss_recovery.value == PowerLossRecoveryMode::Enable) { + file.write(m_writer.enable_power_loss_recovery(PowerLossRecoveryMode::Disable)); } if (m_wipe_tower) // Purge the extruder, pull out the active filament. @@ -4381,10 +4382,9 @@ LayerResult GCode::process_layer( } if (!first_layer && !m_second_layer_things_done) { - // Orca: start tracking power lost recovery - if (print.config().enable_power_loss_recovery.value == true) { - gcode += m_writer.enable_power_loss_recovery(true); - } + // Orca: set power loss recovery + const auto plr_mode = print.config().enable_power_loss_recovery.value; + gcode += m_writer.enable_power_loss_recovery(plr_mode); if (print.is_BBL_printer()) { // BBS: open first layer inspection at second layer diff --git a/src/libslic3r/GCodeWriter.cpp b/src/libslic3r/GCodeWriter.cpp index f3d218750b..1008e5eab1 100644 --- a/src/libslic3r/GCodeWriter.cpp +++ b/src/libslic3r/GCodeWriter.cpp @@ -444,23 +444,28 @@ std::string GCodeWriter::reset_e(bool force) } } -std::string GCodeWriter::enable_power_loss_recovery(bool enable) +std::string GCodeWriter::enable_power_loss_recovery(PowerLossRecoveryMode mode) { std::ostringstream gcode; - + + if (mode == PowerLossRecoveryMode::PrinterConfiguration) + return std::string(); + + const bool enable = mode == PowerLossRecoveryMode::Enable; + if (m_is_bbl_printers) { - gcode << "; start tracking Power Loss Recovery https://wiki.bambulab.com/en/knowledge-sharing/power-loss-recovery\n"; - gcode << "M1003 S" << (enable ? "1" : "0") << "\n"; + gcode << "M1003 S" << (enable ? "1" : "0"); } else if (FLAVOR_IS(gcfMarlinFirmware)) { - gcode << "; start tracking Power-loss Recovery https://marlinfw.org/docs/gcode/M413.html\n"; - gcode << "M413 S" << (enable ? "1" : "0") << "\n"; + gcode << "M413 S" << (enable ? "1" : "0"); + } else { + return std::string(); } - + if (GCodeWriter::full_gcode_comment) gcode << " ; set Power-loss Recovery"; + gcode << "\n"; return gcode.str(); } - std::string GCodeWriter::update_progress(unsigned int num, unsigned int tot, bool allow_100) const { if (FLAVOR_IS_NOT(gcfMakerWare) && FLAVOR_IS_NOT(gcfSailfish)) diff --git a/src/libslic3r/GCodeWriter.hpp b/src/libslic3r/GCodeWriter.hpp index 32e737164d..dbc64694e2 100644 --- a/src/libslic3r/GCodeWriter.hpp +++ b/src/libslic3r/GCodeWriter.hpp @@ -61,7 +61,7 @@ public: std::string set_input_shaping(char axis, float damp, float freq, std::string type) const; std::string reset_e(bool force = false); std::string update_progress(unsigned int num, unsigned int tot, bool allow_100 = false) const; - std::string enable_power_loss_recovery(bool enable); + std::string enable_power_loss_recovery(PowerLossRecoveryMode mode); // return false if this extruder was already selected bool need_toolchange(unsigned int filament_id) const; std::string set_extruder(unsigned int filament_id); diff --git a/src/libslic3r/PrintConfig.cpp b/src/libslic3r/PrintConfig.cpp index 054a57f797..7549eb821d 100644 --- a/src/libslic3r/PrintConfig.cpp +++ b/src/libslic3r/PrintConfig.cpp @@ -161,6 +161,14 @@ static t_config_enum_values s_keys_map_BedTempFormula { }; CONFIG_OPTION_ENUM_DEFINE_STATIC_MAPS(BedTempFormula) +// Orca +static t_config_enum_values s_keys_map_PowerLossRecoveryMode { + { "printer_configuration", int(PowerLossRecoveryMode::PrinterConfiguration) }, + { "enable", int(PowerLossRecoveryMode::Enable) }, + { "disable", int(PowerLossRecoveryMode::Disable) } +}; +CONFIG_OPTION_ENUM_DEFINE_STATIC_MAPS(PowerLossRecoveryMode) + static t_config_enum_values s_keys_map_FuzzySkinType { { "none", int(FuzzySkinType::None) }, { "external", int(FuzzySkinType::External) }, @@ -3376,11 +3384,18 @@ void PrintConfigDef::init_fff_params() def->set_default_value(new ConfigOptionBool(false)); // Orca - def = this->add("enable_power_loss_recovery", coBool); - def->label = L("Turn on Power Loss Recovery"); - def->tooltip = L("Enable this to insert power loss recovery commands in generated G-code.(Only for Bambu Lab printers and Marlin firmware based printers)"); + def = this->add("enable_power_loss_recovery", coEnum); + def->label = L("Power Loss Recovery"); + def->tooltip = L("Choose how to control power loss recovery. When set to Printer configuration, the slicer will not emit power loss recovery G-code and will leave the printer's configuration unchanged. Applicable to Bambu Lab or Marlin 2 firmware based printers."); def->mode = comAdvanced; - def->set_default_value(new ConfigOptionBool(false)); + def->enum_keys_map = &ConfigOptionEnum::get_enum_values(); + def->enum_values.push_back("printer_configuration"); + def->enum_values.push_back("enable"); + def->enum_values.push_back("disable"); + def->enum_labels.push_back(L("Printer configuration")); + def->enum_labels.push_back(L("Enable")); + def->enum_labels.push_back(L("Disable")); + def->set_default_value(new ConfigOptionEnum(PowerLossRecoveryMode::PrinterConfiguration)); //BBS // def = this->add("spaghetti_detector", coBool); @@ -7442,6 +7457,13 @@ void PrintConfigDef::handle_legacy(t_config_option_key &opt_key, std::string &va else if (opt_key == "extruder_type") { ReplaceString(value, "DirectDrive", "Direct Drive"); } + else if (opt_key == "enable_power_loss_recovery") { + if (value == "1" || boost::iequals(value, "true")) { + value = "enable"; + } else if (value == "0" || boost::iequals(value, "false")) { + value = "disable"; + } + } else if(opt_key == "ensure_vertical_shell_thickness") { if(value == "1") { value = "ensure_all"; diff --git a/src/libslic3r/PrintConfig.hpp b/src/libslic3r/PrintConfig.hpp index 1dac4b7057..998764f292 100644 --- a/src/libslic3r/PrintConfig.hpp +++ b/src/libslic3r/PrintConfig.hpp @@ -102,6 +102,13 @@ enum class BedTempFormula { count, }; +// Orca +enum class PowerLossRecoveryMode { + PrinterConfiguration, + Enable, + Disable, +}; + // BBS enum class WallSequence { InnerOuter, @@ -507,6 +514,7 @@ CONFIG_OPTION_ENUM_DECLARE_STATIC_MAPS(PrintHostType) CONFIG_OPTION_ENUM_DECLARE_STATIC_MAPS(AuthorizationType) CONFIG_OPTION_ENUM_DECLARE_STATIC_MAPS(WipeTowerWallType) CONFIG_OPTION_ENUM_DECLARE_STATIC_MAPS(PerimeterGeneratorType) +CONFIG_OPTION_ENUM_DECLARE_STATIC_MAPS(PowerLossRecoveryMode) #undef CONFIG_OPTION_ENUM_DECLARE_STATIC_MAPS @@ -1272,7 +1280,7 @@ PRINT_CONFIG_CLASS_DEFINE( ((ConfigOptionIntsNullable, filament_flush_temp)) // BBS ((ConfigOptionBool, scan_first_layer)) - ((ConfigOptionBool, enable_power_loss_recovery)) + ((ConfigOptionEnum, enable_power_loss_recovery)) ((ConfigOptionBool, enable_wrapping_detection)) ((ConfigOptionInt, wrapping_detection_layers)) ((ConfigOptionPoints, wrapping_exclude_area))