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 <softfeverever@gmail.com>
This commit is contained in:
Ian Bassi
2025-12-30 13:16:47 -03:00
committed by GitHub
parent 0330e86007
commit 7c91459c37
6 changed files with 60 additions and 25 deletions

View File

@@ -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",

View File

@@ -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

View File

@@ -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))

View File

@@ -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);

View File

@@ -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<PowerLossRecoveryMode>::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>(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";

View File

@@ -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<PowerLossRecoveryMode>, enable_power_loss_recovery))
((ConfigOptionBool, enable_wrapping_detection))
((ConfigOptionInt, wrapping_detection_layers))
((ConfigOptionPoints, wrapping_exclude_area))