diff --git a/config/model_menu.conf b/config/model_menu.conf index 3ba83ee6..e8ea8ed0 100644 --- a/config/model_menu.conf +++ b/config/model_menu.conf @@ -1,6 +1,13 @@ -F430NX -D600Pro2 -D600Pro2_V0 -D1000 -D1000_V0 -P800 +[F430NX] +versions = 1.0 + +[D600Pro2HS] +versions = 1.0, 1.1 +#V1.1 Add door detection + +[D1000HS] +versions = 1.0, 1.1 +#V1.1 Add door detection + +[P800] +versions = 1.0 diff --git a/ks_includes/KlippyFactory.py b/ks_includes/KlippyFactory.py index 0995240b..3fe534c0 100644 --- a/ks_includes/KlippyFactory.py +++ b/ks_includes/KlippyFactory.py @@ -49,6 +49,7 @@ class KlippyFactory: "adaptive_meshing": False, "power_loss_recovery": True, "auto_change_nozzle": False, + "door_detect": "Disabled", } for key, val in option_list.items(): script = KlippyGcodes.set_save_variables(key, val) diff --git a/ks_includes/ModelConfig.py b/ks_includes/ModelConfig.py index 819dca4f..2ed83841 100644 --- a/ks_includes/ModelConfig.py +++ b/ks_includes/ModelConfig.py @@ -1,6 +1,6 @@ -import subprocess -import os import logging +import os +import subprocess class ModelConfig: @@ -38,9 +38,37 @@ class ModelConfig: else: return None - def wirte_printer_config(self, device_name): + def write_device_name_config(self, device_name): if device_name: - source_path = f"{os.path.expanduser('~')}/KlipperScreen/printer_config/{device_name}/" + try: + with open(self.klipperscreen_config_path, "r+") as file: + lines = file.readlines() + file.seek(0) + found_printer_section = False + for i, line in enumerate(lines): + if line.strip().startswith("[printer"): + lines[i] = f"[printer {device_name}]\n" + found_printer_section = True + break + if not found_printer_section: + lines.insert(0, f"[printer {device_name}]\n") + file.truncate(0) + file.writelines(lines) + logging.info(f"Setting device name to {device_name}") + except FileNotFoundError: + logging.error( + f"Configuration file {self.klipperscreen_config_path} not found." + ) + + def wirte_printer_config(self, device_name, version): + config_dict = { + "F430NX": "F430NX", + "D600Pro2HS": "D600Pro2", + "D1000HS": "D1000", + "P800": "P800", + } + if device_name: + source_path = f"{os.path.expanduser('~')}/KlipperScreen/printer_config/{config_dict.get(device_name)}/" target_path = f"{os.path.expanduser('~')}/printer_data/config/" if not os.path.exists(target_path): os.makedirs(target_path) @@ -58,6 +86,21 @@ class ModelConfig: except Exception as e: logging.error(f"Error creating symlink for{device_name}:{e}") + source_module_path = os.path.join(source_path, os.path.basename(version)) + target_module_path = os.path.join(target_path, os.path.basename("module")) + try: + if os.path.islink(target_module_path) or os.path.exists(target_module_path): + os.remove(target_module_path) + if version != "1.0": + os.symlink(source_module_path, target_module_path) + logging.info(f"Created config version for {device_name}-{version}.") + except FileExistsError: + logging.error(f"Failed to create version symlink for {device_name}.") + except PermissionError: + logging.error(f"No permission to create version symlink for {device_name}.") + except Exception as e: + logging.error(f"Error creating version symlink for{device_name}:{e}") + source_printer_path = os.path.join(source_path, os.path.basename("printer.cfg")) target_printer_path = os.path.join(target_path, os.path.basename("printer.cfg")) command = ['cp','-f', source_printer_path, target_printer_path] @@ -81,10 +124,11 @@ class ModelConfig: except Exception as e: logging.error(f"An unexpected error occurred: {e}") - def generate_config(self, model): + def generate_config(self, model, version): model_name = model device_name = self.generate_machine_name(model_name) - self.wirte_printer_config(model) + self.write_device_name_config(device_name) + self.wirte_printer_config(model, version) self.wirte_hostname(device_name) os.system("systemctl restart klipper.service") os.system("systemctl restart moonraker.service") diff --git a/ks_includes/locales/KlipperScreen.pot b/ks_includes/locales/KlipperScreen.pot index 4a1a2111..90649464 100644 --- a/ks_includes/locales/KlipperScreen.pot +++ b/ks_includes/locales/KlipperScreen.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-02-26 11:12+0800\n" +"POT-Creation-Date: 2025-03-29 17:34+0800\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -76,6 +76,9 @@ msgstr "" msgid "Adaptive Bed Leveling" msgstr "" +msgid "Add" +msgstr "" + msgid "Add profile" msgstr "" @@ -292,6 +295,9 @@ msgstr "" msgid "Disable for 12hs with am / pm" msgstr "" +msgid "Disabled" +msgstr "" + msgid "Disconnect" msgstr "" @@ -306,6 +312,9 @@ msgstr "" msgid "Do you want to recover %s?" msgstr "" +msgid "Door Open Protection Mode" +msgstr "" + msgid "Elapsed trial time:" msgstr "" @@ -321,9 +330,6 @@ msgstr "" msgid "Enable screen power management" msgstr "" -msgid "Enabled successfully" -msgstr "" - msgid "Error" msgstr "" @@ -643,6 +649,9 @@ msgstr "" msgid "Minimum:" msgstr "" +msgid "Minus" +msgstr "" + msgid "Modified" msgstr "" @@ -763,6 +772,9 @@ msgstr "" msgid "Pause" msgstr "" +msgid "Pause Print" +msgstr "" + msgid "Paused" msgstr "" @@ -775,6 +787,9 @@ msgstr "" msgid "Pins" msgstr "" +msgid "Please close the door and click Resume to proceed." +msgstr "" + msgid "Please ensure that the Probe Calibrate has been performed" msgstr "" @@ -823,6 +838,12 @@ msgstr "" msgid "Printer Select" msgstr "" +msgid "Printer door is opened. Please close the door and then start printing." +msgstr "" + +msgid "Printer door is opening!" +msgstr "" + msgid "Printing" msgstr "" @@ -877,12 +898,6 @@ msgstr "" msgid "Reprint" msgstr "" -msgid "Reset" -msgstr "" - -msgid "Reset successfully" -msgstr "" - msgid "Restart" msgstr "" @@ -1052,6 +1067,9 @@ msgstr "" msgid "Temperature" msgstr "" +msgid "Test Mode" +msgstr "" + msgid "The last print job was not completed continue printing?" msgstr "" @@ -1067,6 +1085,11 @@ msgstr "" msgid "This device is not activated and is available for trial use only" msgstr "" +msgid "" +"This feature allows you to customize the printer's response when door " +"opening is detected" +msgstr "" + msgid "This operation is about to print the model" msgstr "" diff --git a/ks_includes/locales/zh_CN/LC_MESSAGES/KlipperScreen.mo b/ks_includes/locales/zh_CN/LC_MESSAGES/KlipperScreen.mo index b36aa86b..6cc1981f 100644 Binary files a/ks_includes/locales/zh_CN/LC_MESSAGES/KlipperScreen.mo and b/ks_includes/locales/zh_CN/LC_MESSAGES/KlipperScreen.mo differ diff --git a/ks_includes/locales/zh_CN/LC_MESSAGES/KlipperScreen.po b/ks_includes/locales/zh_CN/LC_MESSAGES/KlipperScreen.po index f27c6d50..7c6c54af 100644 --- a/ks_includes/locales/zh_CN/LC_MESSAGES/KlipperScreen.po +++ b/ks_includes/locales/zh_CN/LC_MESSAGES/KlipperScreen.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: KlipperScreen\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-02-26 11:12+0800\n" +"POT-Creation-Date: 2025-03-29 17:34+0800\n" "PO-Revision-Date: 2024-06-03 19:09+0000\n" "Last-Translator: wsj20050623 <2129426599@qq.com>\n" "Language-Team: Chinese (Simplified) \n" "Language-Team: Chinese (Traditional) bool: + async def test_registration(self, val: str) -> bool: + raise NotImplementedError + + @dbus_method_async(result_signature="b") + async def add_registration_time(self) -> bool: + raise NotImplementedError + + @dbus_method_async(result_signature="b") + async def minus_registration_time(self) -> bool: raise NotImplementedError @dbus_property_async(property_signature="b") @@ -146,12 +154,24 @@ class LicenseManager: return self._async_call(_verify, default=False) - def reset_registration(self, code: str) -> bool: + def test_registration(self, code: str) -> bool: async def _reset(): - return await self.registration_interface.proxy.reset_registration(code) + return await self.registration_interface.proxy.test_registration(code) return self._async_call(_reset, default=False) + def add_registration_time(self) -> bool: + async def _add(): + return await self.registration_interface.proxy.add_registration_time() + + return self._async_call(_add, default=False) + + def minus_registration_time(self) -> bool: + async def _minus(): + return await self.registration_interface.proxy.minus_registration_time() + + return self._async_call(_minus, default=False) + def enabled_registration(self) -> bool: async def _get(): return await self.registration_interface.proxy.enabled_registration diff --git a/panels/advanced.py b/panels/advanced.py index 974fbc37..50ae4579 100644 --- a/panels/advanced.py +++ b/panels/advanced.py @@ -3,17 +3,19 @@ import logging import gi gi.require_version("Gtk", "3.0") -from gi.repository import Gtk +from gi.repository import GLib, Gtk from ks_includes.KlippyFactory import KlippyFactory from ks_includes.KlippyGcodes import KlippyGcodes from ks_includes.screen_panel import ScreenPanel +from datetime import datetime class Panel(ScreenPanel): def __init__(self, screen, title): title = title or _("Advanced") super().__init__(screen, title) + self.last_drop_time = datetime.now() self.advanced = {} self.menu_list = {} self.advanced_options = [ @@ -59,6 +61,27 @@ class Panel(ScreenPanel): } }, ] + if self._printer.get_macro("_door_detection"): + self.advanced_options.append( + { + "door_open_detection": { + "section": "main", + "name": _("Door Open Protection Mode"), + "type": "dropdown", + "tooltip": _( + "This feature allows you to customize the printer's response when door opening is detected" + ), + "value": "Disabled", + "callback": self.door_open_detection, + "options": [ + {"name": _("Disabled") + " " + _("(default)"), "value": "Disabled"}, + {"name": _("Pause Print"), "value": "Pause Print"}, + {"name": _("Emergency Stop"), "value": "Emergency Stop"}, + ], + } + } + ) + options = self.advanced_options self.labels["advanced_menu"] = self._gtk.ScrolledWindow() self.labels["advanced"] = Gtk.Grid() @@ -69,6 +92,9 @@ class Panel(ScreenPanel): self.menu_list.update(res) self.content.add(self.labels["advanced_menu"]) + if "door_open_detection" in self.menu_list: + self.menu_list["door_open_detection"].connect("notify::popup-shown", self.on_popup_shown) + def reset_factory_settings(self, *args): text = _("Confirm factory reset?\n") + "\n\n" + _("The system will reboot!") label = Gtk.Label(wrap=True, vexpand=True) @@ -111,6 +137,26 @@ class Panel(ScreenPanel): if response_id == Gtk.ResponseType.OK: KlippyFactory.user_factory_reset(self._screen._ws.klippy, self._config, clear_files_checkbox.get_active()) + def on_popup_shown(self, combo_box, param): + if combo_box.get_property("popup-shown"): + logging.debug("Dropdown popup show") + self.last_drop_time = datetime.now() + else: + elapsed = (datetime.now() - self.last_drop_time).total_seconds() + if elapsed < 0.1: + logging.debug(f"Dropdown closed too fast ({elapsed}s)") + GLib.timeout_add(50, lambda: self.dropdown_keep_open(combo_box)) + return + logging.debug("Dropdown popup close") + + def dropdown_keep_open(self, combo_box): + if isinstance(combo_box, Gtk.ComboBox): + combo_box.popup() + return False + + def door_open_detection(self, str): + self.set_configuration_string("door_detect", str) + def set_adaptive_leveling(self, *args): self.set_configuration_feature("adaptive_meshing", *args) @@ -120,6 +166,11 @@ class Panel(ScreenPanel): def set_auto_change_nozzle(self, *args): self.set_configuration_feature("auto_change_nozzle", *args) + def set_configuration_string(self, feature_name, str): + script = KlippyGcodes.set_save_variables(feature_name, str) + self._screen._send_action(None, "printer.gcode.script", {"script": script}) + logging.info(f"Set {feature_name}: {str}") + def set_configuration_feature(self, feature_name, *args): enable_feature = any(args) script_value = True if enable_feature else False @@ -143,3 +194,10 @@ class Panel(ScreenPanel): self.menu_list["auto_change_nozzle"].set_active(variables["auto_change_nozzle"]) else: self.menu_list["auto_change_nozzle"].set_active(False) + + if self._printer.get_macro("_door_detection"): + if "door_detect" in variables: + model = self.menu_list["door_open_detection"].get_model() + for i, row in enumerate(model): + if row[0] == _(variables["door_detect"]): + self.menu_list["door_open_detection"].set_active(i) diff --git a/panels/factory_settings.py b/panels/factory_settings.py index 786ef4ef..55f1a89a 100644 --- a/panels/factory_settings.py +++ b/panels/factory_settings.py @@ -19,6 +19,10 @@ class Panel(ScreenPanel): def __init__(self, screen, title): title = title or "factory settings" super().__init__(screen, title) + klipperscreendir = pathlib.Path(__file__).parent.resolve().parent + self.model_list_path = os.path.join(klipperscreendir, "config", "model_menu.conf") + self.model_list_config = configparser.ConfigParser() + self.model_list_config.read(self.model_list_path, encoding="utf-8") self.last_drop_time = datetime.now() self.factory_settings_list = [ { @@ -62,6 +66,7 @@ class Panel(ScreenPanel): ] self.settings = {} self.select_model = False + self.select_model_version = False self.labels["setting_menu"] = self._gtk.ScrolledWindow() self.labels["settings"] = Gtk.Grid() self.labels["setting_menu"].add(self.labels["settings"]) @@ -77,6 +82,9 @@ class Panel(ScreenPanel): self.content.show_all() def back(self): + if self.select_model_version: + self.hide_select_model_version() + return True if self.select_model: self.hide_select_model() return True @@ -99,38 +107,53 @@ class Panel(ScreenPanel): combo_box.popup() return False - def show_select_model(self, widget, option): - self.create_select_model() + def create_list_menu(self, menu_list, callback=None): + if "model_menu" in self.labels: + del self.labels["model_menu"] + self.labels["model_menu"] = self._gtk.ScrolledWindow() + self.labels["model"] = Gtk.Grid() + self.labels["model_menu"].add(self.labels["model"]) + self.models = {} + for value in menu_list: + self.models[value] = { + "name": value, + "type": "button", + "callback": callback, + } + self.add_option("model", self.models, value, self.models[value]) + + def show_select_model(self, widget=None, option=None): + self.create_list_menu(self.model_list_config.sections(), self._on_model_selected) for child in self.content.get_children(): self.content.remove(child) self.content.add(self.labels["model_menu"]) self.content.show_all() self.select_model = True - def create_select_model(self): - if "model_menu" in self.labels: - return + def show_select_model_version(self, model): + versions_str = self.model_list_config[model].get("versions", "") + versions = [v.strip() for v in versions_str.split(",") if v.strip()] + self.create_list_menu(versions, self._on_version_selected) + self.select_model_version = True + self.model = model + + def _on_model_selected(self, widget, event): + for child in self.content.get_children(): + self.content.remove(child) + self.show_select_model_version(event) + self.content.add(self.labels["model_menu"]) + self.content.show_all() + + def _on_version_selected(self, widget, version): if not hasattr(self, "model_config") or self.model_config is None: self.model_config = ModelConfig() - self.labels["model_menu"] = self._gtk.ScrolledWindow() - self.labels["model"] = Gtk.Grid() - self.labels["model_menu"].add(self.labels["model"]) - klipperscreendir = pathlib.Path(__file__).parent.resolve().parent - self.model_list_path = os.path.join(klipperscreendir, "config", "model_menu.conf") - self.model_list = pathlib.Path(self.model_list_path).read_text() - with open(self.model_list_path) as file: - self.models = {} - for line in file: - model_name = line.strip() - self.models[model_name] = { - "name": model_name, - "type": "button", - "callback": self.change_model, - } - self.add_option("model", self.models, model_name, self.models[model_name]) + self.model_config.generate_config(self.model, version) - def change_model(self, widget, event): - self.model_config.generate_config(event) + def hide_select_model_version(self): + for child in self.content.get_children(): + self.content.remove(child) + self.show_select_model() + self.select_model_version = False def hide_select_model(self): for child in self.content.get_children(): @@ -148,7 +171,7 @@ class Panel(ScreenPanel): {"name": _("Accept"), "response": Gtk.ResponseType.OK, "style": "dialog-error"}, {"name": _("Cancel"), "response": Gtk.ResponseType.CANCEL, "style": "dialog-info"}, ] - + text = _("Are you sure?\n") + "\n\n" + _("The system will reboot!") label = Gtk.Label(wrap=True, vexpand=True) label.set_markup(text) @@ -158,7 +181,6 @@ class Panel(ScreenPanel): checkbox.set_halign(Gtk.Align.CENTER) checkbox.set_valign(Gtk.Align.CENTER) - grid = Gtk.Grid(row_homogeneous=True, column_homogeneous=True) grid.set_row_spacing(20) grid.set_column_spacing(0) @@ -173,7 +195,6 @@ class Panel(ScreenPanel): self.confirm_factory_reset_production, checkbox, ) - def confirm_factory_reset_production(self, dialog, response_id, checkbox): self._gtk.remove_dialog(dialog) diff --git a/panels/license.py b/panels/license.py index e83b818b..04a313f7 100644 --- a/panels/license.py +++ b/panels/license.py @@ -17,6 +17,9 @@ class Panel(ScreenPanel): + _("Please enter a key to activate") ) self.key_len = 15 + self.key_val_test = 1 + self.key_val_add = 2 + self.key_val_minus = 3 self.full = False self.interface = screen.license self.serial_num = self.interface.get_unique_id() or _("Unknown") @@ -71,6 +74,13 @@ class Panel(ScreenPanel): for child in self.content.get_children(): self.content.remove(child) + def display_test_dialog(self, key_text=""): + buttons = [ + {"name": _("Add"), "response": self.key_val_add, "style": "dialog-secondary"}, + {"name": _("Minus"), "response": self.key_val_minus, "style": "dialog-info"}, + {"name": _("Close"), "response": Gtk.ResponseType.CLOSE, "style": "dialog-error"}, + ] + self.create_license_key_dialog(buttons=buttons, key=key_text) def display_dialog(self, full=False, key=""): BUTTON_CONFIGS = { "trial_with_callback": [ @@ -78,12 +88,12 @@ class Panel(ScreenPanel): {"name": _("Skip"), "response": Gtk.ResponseType.CANCEL, "style": "dialog-error"}, ], "full_features": [ - {"name": _("Reset"), "response": Gtk.ResponseType.APPLY, "style": "dialog-secondary"}, + {"name": _("Test Mode"), "response": self.key_val_test, "style": "dialog-secondary"}, {"name": _("Activate"), "response": Gtk.ResponseType.OK, "style": "dialog-info"}, {"name": _("Close"), "response": Gtk.ResponseType.CLOSE, "style": "dialog-error"}, ], "Trial": [ - {"name": _("Activate"), "response": Gtk.ResponseType.OK, "style": "dialog-info"}, + {"name": _("Activate"), "response": Gtk.ResponseType.YES, "style": "dialog-info"}, {"name": _("Trial"), "response": Gtk.ResponseType.CLOSE, "style": "dialog-error"}, ], "default": [ @@ -133,6 +143,7 @@ class Panel(ScreenPanel): status_text = _("Unknown") elif self.is_active: status_text = _("Permanent Activation") + self.title_label.set_markup(f"{status_text}\n") self.license_box["state_text"], self.license_box["state_text_value"] = add_labeled_value( 0, _("State:"), status_text ) @@ -178,18 +189,14 @@ class Panel(ScreenPanel): def confirm_license_response(self, dialog, response_id): if response_id == Gtk.ResponseType.YES: - if self.interface.enabled_registration(): - self.state_update(_("Enabled successfully")) - elif response_id == Gtk.ResponseType.APPLY: if len(self.license_box["key_input"].get_text()) == 0: self.state_update(_("Key is empty")) return - else: - if self.interface.reset_registration(self.license_box["key_input"].get_text()): - self.update_time() - self.state_update(_("Reset successfully")) - else: - self.state_update(_("Key is invalid")) + self.verify_key(self.license_box["key_input"].get_text()) + self.update_time() + if self.interface.is_active(): + self._gtk.remove_dialog(dialog) + self._screen._menu_go_back() elif response_id == Gtk.ResponseType.CLOSE: self._gtk.remove_dialog(dialog) self._screen._menu_go_back() @@ -205,6 +212,21 @@ class Panel(ScreenPanel): return self.verify_key(self.license_box["key_input"].get_text()) self.update_time() + elif response_id == self.key_val_test: + if len(self.license_box["key_input"].get_text()) == 0: + self.state_update(_("Key is empty")) + return + if self.interface.test_registration(self.license_box["key_input"].get_text()): + self._gtk.remove_dialog(dialog) + self.display_test_dialog() + else: + self.state_update(_("Key is invalid")) + elif response_id == self.key_val_add: + self.interface.add_registration_time() + self.update_time() + elif response_id == self.key_val_minus: + self.interface.minus_registration_time() + self.update_time() def on_show_keyboard(self, entry=None, event=None): self._gtk.remove_dialog(self.dialog) diff --git a/panels/splash_screen.py b/panels/splash_screen.py index 4c8f4a36..3371b2f4 100644 --- a/panels/splash_screen.py +++ b/panels/splash_screen.py @@ -24,22 +24,10 @@ class Panel(ScreenPanel): self.labels["menu"] = self._gtk.Button("more-settings", _("Menu"), "color4") self.labels["menu"].connect("clicked", self._screen._go_to_submenu, "") - self.labels["restart"] = self._gtk.Button( - "refresh", _("Klipper Restart"), "color1" - ) - self.labels["restart"].connect("clicked", self.restart_klipper) self.labels["firmware_restart"] = self._gtk.Button( "refresh", _("Firmware Restart"), "color2" ) self.labels["firmware_restart"].connect("clicked", self.firmware_restart) - self.labels["restart_system"] = self._gtk.Button( - "refresh", _("System Restart"), "color1" - ) - self.labels["restart_system"].connect("clicked", self.reboot_poweroff, "reboot") - self.labels["shutdown"] = self._gtk.Button( - "shutdown", _("System Shutdown"), "color2" - ) - self.labels["shutdown"].connect("clicked", self.reboot_poweroff, "shutdown") self.labels["retry"] = self._gtk.Button("load", _("Retry"), "color3") self.labels["retry"].connect("clicked", self.retry) @@ -79,16 +67,12 @@ class Panel(ScreenPanel): self.add_power_button(power_devices) if self._screen.initialized: - self.labels["actions"].add(self.labels["restart"]) self.labels["actions"].add(self.labels["firmware_restart"]) - else: - self.labels["actions"].add(self.labels["restart_system"]) - self.labels["actions"].add(self.labels["shutdown"]) self.labels["actions"].add(self.labels["menu"]) if ( self._screen._ws - and not self._screen._ws.connecting - or self._screen.reinit_count > self._screen.max_retries + and self._screen._ws.connecting + or self._screen.reinit_count > self._screen.max_retries or not self._screen.initialized ): self.labels["actions"].add(self.labels["retry"]) self.labels["actions"].show_all() diff --git a/printer_config/D1000/1.1/door_detect.cfg b/printer_config/D1000/1.1/door_detect.cfg new file mode 120000 index 00000000..7f384b92 --- /dev/null +++ b/printer_config/D1000/1.1/door_detect.cfg @@ -0,0 +1 @@ +../../module/door_detect.cfg \ No newline at end of file diff --git a/printer_config/D1000/base.cfg b/printer_config/D1000/base.cfg index ee778b15..4276e197 100644 --- a/printer_config/D1000/base.cfg +++ b/printer_config/D1000/base.cfg @@ -9,6 +9,10 @@ filename: ~/printer_data/config/config_variables.cfg [exclude_object] +[board_pins] +aliases: + DOOR_PIN=PC5 + [gcode_arcs] resolution: 1.0 @@ -103,14 +107,16 @@ position_min: -4 homing_speed: 10 second_homing_speed: 1 homing_retract_dist: 2.0 +step_pulse_duration: 0.000005 [heater_bed] heater_pin: PD12 sensor_type: Generic 3950 sensor_pin: PC0 max_power: 1.0 -min_temp: 0 -max_temp: 130 +min_temp: -20 +max_temp: 100 +overshoot: 10 # control: pid # pid_kp: 17.22 # pid_ki: 0.9 @@ -127,8 +133,9 @@ heater_pin:PD15 max_power:1.0 sensor_type: Generic 3950 sensor_pin:PC3 -min_temp: 0 -max_temp: 70 +min_temp: -20 +max_temp: 60 +overshoot: 10 pwm_cycle_time: 0.3 # control: pid # pid_kp: 30.68 @@ -246,8 +253,9 @@ max_extrude_only_accel: 1000.0 max_extrude_cross_section:5 heater_pin: tool:PC6 max_power: 1.0 -min_temp: 0 -max_temp: 435 +min_temp: -20 +max_temp: 420 +overshoot: 20 min_extrude_temp: 180 pressure_advance: 0.03 pressure_advance_smooth_time:0.040 @@ -295,8 +303,9 @@ max_extrude_only_accel: 1000.0 max_extrude_cross_section:5 heater_pin: tool:PC7 max_power: 1.0 -min_temp: 0 -max_temp: 435 +min_temp: -20 +max_temp: 420 +overshoot: 20 min_extrude_temp: 180 pressure_advance: 0.032 pressure_advance_smooth_time:0.040 @@ -363,7 +372,10 @@ gcode: [gcode_macro T0] gcode: - {% set filament_insert = printer["filament_switch_sensor extruder"].filament_detected|default(False) %} + {% set client = printer['gcode_macro _CLIENT_VARIABLE']|default({}) %} + {% set filament_insert = True if client.filament_sensor|default("") == "" + else True if not printer[client.filament_sensor].enabled + else printer[client.filament_sensor].filament_detected|default(False) %} {% set printing = printer.print_stats.state == "printing" %} {% if filament_insert or printing == False %} SET_SERVO SERVO=switch_nozzle angle=135 @@ -390,7 +402,10 @@ gcode: {% set y_offset = sv.nozzle_y_offset_val|default(0)|float %} {% set z_offset = sv.nozzle_z_offset_val|default(0)|float %} {% set x_offset = x_offset - 59 %} - {% set filament_insert = printer["filament_switch_sensor extruder1"].filament_detected|default(False) %} + {% set client = printer['gcode_macro _CLIENT_VARIABLE']|default({}) %} + {% set filament_insert = True if client.filament_sensor1|default("") == "" + else True if not printer[client.filament_sensor1].enabled + else printer[client.filament_sensor1].filament_detected|default(False) %} {% set printing = (printer.print_stats.state == "printing") %} {% if filament_insert or printing == False %} SET_SERVO SERVO=switch_nozzle angle=135 @@ -654,13 +669,14 @@ gcode: [gcode_macro _USER_PAUSE] gcode: - {% set extruderTools = [('extruder', 'last_extruder_temp'), - ('extruder1', 'last_extruder1_temp')] %} + {% set heaters = [('extruder', 'last_extruder_temp'), + ('extruder1', 'last_extruder1_temp'), + ('heater_bed', 'last_bed_temp')] %} {% set act = printer.gcode_move.gcode_position %} SAVE_VARIABLE VARIABLE=power_resume_z VALUE={act.z} - {% for extruder_name, name in extruderTools %} - {% set temp = printer[extruder_name].target if extruder_name in printer else 0 %} - {% set restore = False if printer[extruder_name] == '' + {% for heater, name in heaters %} + {% set temp = printer[heater].target if heater in printer else 0 %} + {% set restore = False if printer[heater] == '' else True if params.RESTORE|default(1)|int == 1 else False %} SET_GCODE_VARIABLE MACRO=RESUME VARIABLE={name} VALUE="{{'restore': restore, 'temp': temp}}" {% endfor %} @@ -711,6 +727,10 @@ gcode: {% set extruder_info = [ {'index': 0, 'name': 'last_extruder_temp'}, {'index': 1, 'name': 'last_extruder1_temp'}] %} + {% set value = printer["gcode_macro RESUME"]["last_bed_temp"].temp %} + {% if value != 0 %} + M190 S{value} + {% endif %} {% set temperature = "last_extruder_temp" if printer.toolhead.extruder == "extruder" else "last_extruder1_temp" %} {% set value = printer["gcode_macro RESUME"][temperature].temp %} {% if printer[printer.toolhead.extruder].temperature < value-3 %} @@ -770,11 +790,28 @@ gcode: {% endif %} {% endif %} +[gcode_macro _REAPPLY_OFFSET] +gcode: + {% set re_extruder = printer['gcode_macro RESUME'].resume_extruder|default("extruder") %} + {% set svv = printer.save_variables.variables %} + {% set x_offset = svv.nozzle_x_offset_val|default(0)|float %} + {% set y_offset = svv.nozzle_y_offset_val|default(0)|float %} + {% set z_offset = svv.nozzle_z_offset_val|default(0)|float %} + {% set x_offset = x_offset - 59 %} + {% set is_extruder = printer.toolhead.extruder == "extruder" %} + + {% if printer.toolhead.extruder!= re_extruder %} + SET_GCODE_OFFSET Z={0 if is_extruder else z_offset} MOVE=1 + SET_GCODE_OFFSET Y={0 if is_extruder else y_offset} + SET_GCODE_OFFSET X={0 if is_extruder else x_offset} + {% endif %} + [gcode_macro RESUME] description: Resume the actual running print rename_existing: RESUME_BASE variable_last_extruder_temp: {'restore': False, 'temp': 0} variable_last_extruder1_temp: {'restore': False, 'temp': 0} +variable_last_bed_temp: {'restore': False, 'temp': 0} variable_restore_idle_timeout: 0 variable_idle_state: False variable_filament_state: "" @@ -786,28 +823,41 @@ gcode: {% set client = printer['gcode_macro _CLIENT_VARIABLE']|default({}) %} {% set do_resume = False %} {% set runout = True %} - ##### end of definitions ##### - _FILAMENT_UPDATE - _RESUME_EXTRUDER AUTOSHIFT={autoshift} - _EXTRUDER_TEMPERATURE_HANDLE + {% macro resume_action() %} + _FILAMENT_UPDATE + _RESUME_EXTRUDER AUTOSHIFT={autoshift} + _EXTRUDER_TEMPERATURE_HANDLE - {% set can_extrude = True if printer.toolhead.extruder == '' # no extruder defined in config - else printer[printer.toolhead.extruder].can_extrude %} # status of active extruder - #### Printer comming from timeout idle state #### - {% if printer.idle_timeout.state|upper == "IDLE" or idle_state or autoshift %} - SET_GCODE_VARIABLE MACRO=RESUME VARIABLE=idle_state VALUE=False + {% set can_extrude = True if printer.toolhead.extruder == '' # no extruder defined in config + else printer[printer.toolhead.extruder].can_extrude %} # status of active extruder + #### Printer comming from timeout idle state #### + {% if printer.idle_timeout.state|upper == "IDLE" or idle_state or autoshift %} + SET_GCODE_VARIABLE MACRO=RESUME VARIABLE=idle_state VALUE=False + {% endif %} {% if last_extruder_temp.restore or last_extruder1_temp.restore %} - # we need to use the unicode (\u00B0) for the ° as py2 env's would throw an error otherwise - {client.user_temp_macro|default("")} + { client.user_temp_macro|default("") } {% set do_resume = True %} {% elif can_extrude %} {% set do_resume = True %} {% endif %} - #### Printer comming out of regular PAUSE state #### - {% elif can_extrude %} - {% set do_resume = True %} + _ACT_RESUME DO_RESUME={ do_resume } + {% endmacro %} + {% if printer['gcode_button _door_detection'] %} + {% set sv = printer.save_variables.variables %} + {% set door_function = sv.door_detect|default("Disabled") %} + {% set door_state = printer['gcode_button _door_detection'].state|default('released')|lower %} + + {% if door_function == 'Pause Print' and door_state == 'released' %} + RESPOND TYPE=command MSG="action:prompt_begin" + RESPOND TYPE=command MSG="action:prompt_text Please close the door and click Resume to proceed." + RESPOND TYPE=command MSG="action:prompt_footer_button Ok|RESPOND TYPE=command MSG=action:prompt_end" + RESPOND TYPE=command MSG="action:prompt_show" + {% else %} + { resume_action() } + {% endif %} + {% else %} + { resume_action() } {% endif %} - _ACT_RESUME DO_RESUME={do_resume} [gcode_macro _ACT_RESUME] gcode: @@ -826,6 +876,7 @@ gcode: {client.user_resume_macro|default("")} _CLIENT_EXTRUDE RESUME_BASE VELOCITY={params.VELOCITY|default(sp_move)} + _REAPPLY_OFFSET SET_GCODE_VARIABLE MACRO=RESUME VARIABLE=change_runout VALUE="None" {% else %} {% set msg = "Left" if printer.toolhead.extruder == "extruder" else "Right" %} @@ -928,9 +979,9 @@ gcode: RUN_SHELL_COMMAND CMD=_CLEAR_PLR SAVE_VARIABLE VARIABLE=last_file VALUE='"{ filename }"' SAVE_VARIABLE VARIABLE=filepath VALUE='"{ filepath }"' - {% set zero_vars = ['power_resume_x', 'power_resume_y', 'power_resume_z'] %} + {% set zero_vars = ['power_resume_position', 'power_resume_line'] %} {% for var in zero_vars %} - SAVE_VARIABLE VARIABLE={var} VALUE=0 + SAVE_VARIABLE VARIABLE={var} VALUE=0 {% endfor %} SAVE_VARIABLE VARIABLE=was_interrupted VALUE=False @@ -946,9 +997,9 @@ gcode: {% set park_dz = client.custom_park_dz|default(2.0)|abs %} RESPOND TYPE=command MSG="action:prompt_end" SET_GCODE_OFFSET Z=0 MOVE=0 - {% set z_height = params.Z_HEIGHT|default(sv.power_resume_z)|float %} {% set is_paused = sv.power_loss_paused|default(False) %} - {% set last_file = params.GCODE_FILE|default(sv.last_file)|string %} + {% set filepath = params.GCODE_FILE|default(sv.filepath)|string %} + {% set last_file = filepath.split('/')[-1] %} {% set hotend = sv.power_resume_extruder|default("extruder")%} {% set z_offset = sv.nozzle_z_offset_val|default(0)|float %} {% set z_offset_total = park_dz if is_paused else 0 %} @@ -958,7 +1009,7 @@ gcode: SET_STEPPER_ENABLE STEPPER=stepper_z ENABLE=1 G4 P300 M118 Recovery in progress, please wait - RUN_SHELL_COMMAND CMD=_POWER_LOSS_RECOVERY PARAMS="{z_height} \"{last_file}\" \"{z_offset_total}\"" + RUN_SHELL_COMMAND CMD=_POWER_LOSS_RECOVERY PARAMS="{z_offset_total}" SDCARD_PRINT_FILE FILENAME=.plr/"{last_file}" SAVE_VARIABLE VARIABLE=was_interrupted VALUE=False @@ -1140,4 +1191,6 @@ gcode: [gcode_macro _NOZZLE_XY_OFFSET_CALIBRATE] gcode: RUN_SHELL_COMMAND CMD=fetch_assets PARAMS="\"Gcode\" \"D1000HS\" \"NozzleAglin.zip\"" - SDCARD_PRINT_FILE FILENAME=".PresetModel/NozzleAglin.gcode" \ No newline at end of file + SDCARD_PRINT_FILE FILENAME=".PresetModel/NozzleAglin.gcode" + +[include module/*.cfg] diff --git a/printer_config/D600Pro2/1.1/door_detect.cfg b/printer_config/D600Pro2/1.1/door_detect.cfg new file mode 120000 index 00000000..7f384b92 --- /dev/null +++ b/printer_config/D600Pro2/1.1/door_detect.cfg @@ -0,0 +1 @@ +../../module/door_detect.cfg \ No newline at end of file diff --git a/printer_config/D600Pro2/base.cfg b/printer_config/D600Pro2/base.cfg index b28c7c23..1c7fa12b 100644 --- a/printer_config/D600Pro2/base.cfg +++ b/printer_config/D600Pro2/base.cfg @@ -9,6 +9,10 @@ filename: ~/printer_data/config/config_variables.cfg [exclude_object] +[board_pins] +aliases: + DOOR_PIN=PC5 + [gcode_arcs] resolution: 1.0 @@ -103,14 +107,16 @@ position_min: -4 homing_speed: 10 second_homing_speed: 1 homing_retract_dist: 2.0 +step_pulse_duration: 0.000005 [heater_bed] heater_pin: PD12 sensor_type: Generic 3950 sensor_pin: PC0 max_power: 1.0 -min_temp: 0 -max_temp: 130 +min_temp: -20 +max_temp: 100 +overshoot: 10 # control: pid # pid_kp: 59.368 # pid_ki: 1.656 @@ -127,8 +133,9 @@ heater_pin:PD15 max_power:1.0 sensor_type: Generic 3950 sensor_pin:PC3 -min_temp: 0 -max_temp: 80 +min_temp: -20 +max_temp: 70 +overshoot: 10 pwm_cycle_time: 0.3 # control: pid # pid_kp: 30.68 @@ -246,8 +253,9 @@ max_extrude_only_accel: 1000.0 max_extrude_cross_section:5 heater_pin: tool:PC6 max_power: 1.0 -min_temp: 0 -max_temp: 435 +min_temp: -20 +max_temp: 420 +overshoot: 20 min_extrude_temp: 180 pressure_advance: 0.03 pressure_advance_smooth_time:0.040 @@ -295,8 +303,9 @@ max_extrude_only_accel: 1000.0 max_extrude_cross_section:5 heater_pin: tool:PC7 max_power: 1.0 -min_temp: 0 -max_temp: 435 +min_temp: -20 +max_temp: 420 +overshoot: 20 min_extrude_temp: 180 pressure_advance: 0.032 pressure_advance_smooth_time:0.040 @@ -363,7 +372,10 @@ gcode: [gcode_macro T0] gcode: - {% set filament_insert = printer["filament_switch_sensor extruder"].filament_detected|default(False) %} + {% set client = printer['gcode_macro _CLIENT_VARIABLE']|default({}) %} + {% set filament_insert = True if client.filament_sensor|default("") == "" + else True if not printer[client.filament_sensor].enabled + else printer[client.filament_sensor].filament_detected|default(False) %} {% set printing = printer.print_stats.state == "printing" %} {% if filament_insert or printing == False %} SET_SERVO SERVO=switch_nozzle angle=135 @@ -390,7 +402,10 @@ gcode: {% set y_offset = sv.nozzle_y_offset_val|default(0)|float %} {% set z_offset = sv.nozzle_z_offset_val|default(0)|float %} {% set x_offset = x_offset - 59 %} - {% set filament_insert = printer["filament_switch_sensor extruder1"].filament_detected|default(False) %} + {% set client = printer['gcode_macro _CLIENT_VARIABLE']|default({}) %} + {% set filament_insert = True if client.filament_sensor1|default("") == "" + else True if not printer[client.filament_sensor1].enabled + else printer[client.filament_sensor1].filament_detected|default(False) %} {% set printing = (printer.print_stats.state == "printing") %} {% if filament_insert or printing == False %} SET_SERVO SERVO=switch_nozzle angle=135 @@ -417,7 +432,7 @@ gcode: [gcode_macro PROBE_SERVO_CLOSE] gcode: - SET_SERVO SERVO=probe_servo angle=130 + SET_SERVO SERVO=probe_servo angle=170 G4 P2000 [gcode_macro _START_PRINT_BASE] @@ -538,12 +553,18 @@ gcode: {% set do_z = 'Z' in params|string %} {% if do_x %} + SET_STEPPER_ENABLE STEPPER=stepper_x ENABLE=1 + G4 P300 {% set homing_cmd = 'X ' %} {% endif %} {% if do_y %} + SET_STEPPER_ENABLE STEPPER=stepper_y ENABLE=1 + G4 P300 {% set homing_cmd = homing_cmd + 'Y ' %} {% endif %} {% if do_z %} + SET_STEPPER_ENABLE STEPPER=stepper_z ENABLE=1 + G4 P300 {% if 'x' not in printer.toolhead.homed_axes|lower or 'y' not in printer.toolhead.homed_axes|lower %} {% set homing_cmd = 'X Y Z' %} {% else %} @@ -551,6 +572,10 @@ gcode: {% endif %} {% endif %} {% if not homing_cmd %} + SET_STEPPER_ENABLE STEPPER=stepper_x ENABLE=1 + SET_STEPPER_ENABLE STEPPER=stepper_y ENABLE=1 + SET_STEPPER_ENABLE STEPPER=stepper_z ENABLE=1 + G4 P300 C28 _ACTIVATE_DEFAULT_EXTRUDER {% else %} @@ -645,13 +670,14 @@ gcode: [gcode_macro _USER_PAUSE] gcode: - {% set extruderTools = [('extruder', 'last_extruder_temp'), - ('extruder1', 'last_extruder1_temp')] %} + {% set heaters = [('extruder', 'last_extruder_temp'), + ('extruder1', 'last_extruder1_temp'), + ('heater_bed', 'last_bed_temp')] %} {% set act = printer.gcode_move.gcode_position %} SAVE_VARIABLE VARIABLE=power_resume_z VALUE={act.z} - {% for extruder_name, name in extruderTools %} - {% set temp = printer[extruder_name].target if extruder_name in printer else 0 %} - {% set restore = False if printer[extruder_name] == '' + {% for heater, name in heaters %} + {% set temp = printer[heater].target if heater in printer else 0 %} + {% set restore = False if printer[heater] == '' else True if params.RESTORE|default(1)|int == 1 else False %} SET_GCODE_VARIABLE MACRO=RESUME VARIABLE={name} VALUE="{{'restore': restore, 'temp': temp}}" {% endfor %} @@ -702,6 +728,10 @@ gcode: {% set extruder_info = [ {'index': 0, 'name': 'last_extruder_temp'}, {'index': 1, 'name': 'last_extruder1_temp'}] %} + {% set value = printer["gcode_macro RESUME"]["last_bed_temp"].temp %} + {% if value != 0 %} + M190 S{value} + {% endif %} {% set temperature = "last_extruder_temp" if printer.toolhead.extruder == "extruder" else "last_extruder1_temp" %} {% set value = printer["gcode_macro RESUME"][temperature].temp %} {% if printer[printer.toolhead.extruder].temperature < value-3 %} @@ -761,11 +791,28 @@ gcode: {% endif %} {% endif %} +[gcode_macro _REAPPLY_OFFSET] +gcode: + {% set re_extruder = printer['gcode_macro RESUME'].resume_extruder|default("extruder") %} + {% set svv = printer.save_variables.variables %} + {% set x_offset = svv.nozzle_x_offset_val|default(0)|float %} + {% set y_offset = svv.nozzle_y_offset_val|default(0)|float %} + {% set z_offset = svv.nozzle_z_offset_val|default(0)|float %} + {% set x_offset = x_offset - 59 %} + {% set is_extruder = printer.toolhead.extruder == "extruder" %} + + {% if printer.toolhead.extruder!= re_extruder %} + SET_GCODE_OFFSET Z={0 if is_extruder else z_offset} MOVE=1 + SET_GCODE_OFFSET Y={0 if is_extruder else y_offset} + SET_GCODE_OFFSET X={0 if is_extruder else x_offset} + {% endif %} + [gcode_macro RESUME] description: Resume the actual running print rename_existing: RESUME_BASE variable_last_extruder_temp: {'restore': False, 'temp': 0} variable_last_extruder1_temp: {'restore': False, 'temp': 0} +variable_last_bed_temp: {'restore': False, 'temp': 0} variable_restore_idle_timeout: 0 variable_idle_state: False variable_filament_state: "" @@ -777,29 +824,41 @@ gcode: {% set client = printer['gcode_macro _CLIENT_VARIABLE']|default({}) %} {% set do_resume = False %} {% set runout = True %} - ##### end of definitions ##### - _FILAMENT_UPDATE - _RESUME_EXTRUDER AUTOSHIFT={autoshift} - _EXTRUDER_TEMPERATURE_HANDLE + {% macro resume_action() %} + _FILAMENT_UPDATE + _RESUME_EXTRUDER AUTOSHIFT={autoshift} + _EXTRUDER_TEMPERATURE_HANDLE - {% set can_extrude = True if printer.toolhead.extruder == '' # no extruder defined in config - else printer[printer.toolhead.extruder].can_extrude %} # status of active extruder - - #### Printer comming from timeout idle state #### - {% if printer.idle_timeout.state|upper == "IDLE" or idle_state or autoshift %} - SET_GCODE_VARIABLE MACRO=RESUME VARIABLE=idle_state VALUE=False + {% set can_extrude = True if printer.toolhead.extruder == '' # no extruder defined in config + else printer[printer.toolhead.extruder].can_extrude %} # status of active extruder + #### Printer comming from timeout idle state #### + {% if printer.idle_timeout.state|upper == "IDLE" or idle_state or autoshift %} + SET_GCODE_VARIABLE MACRO=RESUME VARIABLE=idle_state VALUE=False + {% endif %} {% if last_extruder_temp.restore or last_extruder1_temp.restore %} - # we need to use the unicode (\u00B0) for the ° as py2 env's would throw an error otherwise - {client.user_temp_macro|default("")} + { client.user_temp_macro|default("") } {% set do_resume = True %} {% elif can_extrude %} {% set do_resume = True %} {% endif %} - #### Printer comming out of regular PAUSE state #### - {% elif can_extrude %} - {% set do_resume = True %} + _ACT_RESUME DO_RESUME={ do_resume } + {% endmacro %} + {% if printer['gcode_button _door_detection'] %} + {% set sv = printer.save_variables.variables %} + {% set door_function = sv.door_detect|default("Disabled") %} + {% set door_state = printer['gcode_button _door_detection'].state|default('released')|lower %} + + {% if door_function == 'Pause Print' and door_state == 'released' %} + RESPOND TYPE=command MSG="action:prompt_begin" + RESPOND TYPE=command MSG="action:prompt_text Please close the door and click Resume to proceed." + RESPOND TYPE=command MSG="action:prompt_footer_button Ok|RESPOND TYPE=command MSG=action:prompt_end" + RESPOND TYPE=command MSG="action:prompt_show" + {% else %} + { resume_action() } + {% endif %} + {% else %} + { resume_action() } {% endif %} - _ACT_RESUME DO_RESUME={do_resume} [gcode_macro _ACT_RESUME] gcode: @@ -818,6 +877,7 @@ gcode: {client.user_resume_macro|default("")} _CLIENT_EXTRUDE RESUME_BASE VELOCITY={params.VELOCITY|default(sp_move)} + _REAPPLY_OFFSET SET_GCODE_VARIABLE MACRO=RESUME VARIABLE=change_runout VALUE="None" {% else %} {% set msg = "Left" if printer.toolhead.extruder == "extruder" else "Right" %} @@ -920,9 +980,9 @@ gcode: RUN_SHELL_COMMAND CMD=_CLEAR_PLR SAVE_VARIABLE VARIABLE=last_file VALUE='"{ filename }"' SAVE_VARIABLE VARIABLE=filepath VALUE='"{ filepath }"' - {% set zero_vars = ['power_resume_x', 'power_resume_y', 'power_resume_z'] %} + {% set zero_vars = ['power_resume_position', 'power_resume_line'] %} {% for var in zero_vars %} - SAVE_VARIABLE VARIABLE={var} VALUE=0 + SAVE_VARIABLE VARIABLE={var} VALUE=0 {% endfor %} SAVE_VARIABLE VARIABLE=was_interrupted VALUE=False @@ -938,9 +998,9 @@ gcode: {% set park_dz = client.custom_park_dz|default(2.0)|abs %} RESPOND TYPE=command MSG="action:prompt_end" SET_GCODE_OFFSET Z=0 MOVE=0 - {% set z_height = params.Z_HEIGHT|default(sv.power_resume_z)|float %} {% set is_paused = sv.power_loss_paused|default(False) %} - {% set last_file = params.GCODE_FILE|default(sv.last_file)|string %} + {% set filepath = params.GCODE_FILE|default(sv.filepath)|string %} + {% set last_file = filepath.split('/')[-1] %} {% set hotend = sv.power_resume_extruder|default("extruder")%} {% set z_offset = sv.nozzle_z_offset_val|default(0)|float %} {% set z_offset_total = park_dz if is_paused else 0 %} @@ -950,7 +1010,7 @@ gcode: SET_STEPPER_ENABLE STEPPER=stepper_z ENABLE=1 G4 P300 M118 Recovery in progress, please wait - RUN_SHELL_COMMAND CMD=_POWER_LOSS_RECOVERY PARAMS="{z_height} \"{last_file}\" \"{z_offset_total}\"" + RUN_SHELL_COMMAND CMD=_POWER_LOSS_RECOVERY PARAMS="{z_offset_total}" SDCARD_PRINT_FILE FILENAME=.plr/"{last_file}" SAVE_VARIABLE VARIABLE=was_interrupted VALUE=False @@ -1132,4 +1192,6 @@ gcode: [gcode_macro _NOZZLE_XY_OFFSET_CALIBRATE] gcode: RUN_SHELL_COMMAND CMD=fetch_assets PARAMS="\"Gcode\" \"D600Pro2HS\" \"NozzleAglin.zip\"" - SDCARD_PRINT_FILE FILENAME=".PresetModel/NozzleAglin.gcode" \ No newline at end of file + SDCARD_PRINT_FILE FILENAME=".PresetModel/NozzleAglin.gcode" + +[include module/*.cfg] diff --git a/printer_config/F430NX/base.cfg b/printer_config/F430NX/base.cfg index a16495cc..0b30881f 100644 --- a/printer_config/F430NX/base.cfg +++ b/printer_config/F430NX/base.cfg @@ -48,7 +48,7 @@ square_corner_velocity: 5.0 speed: 100 horizontal_move_z: 7 mesh_min: 34.6,17.4 -mesh_max: 420, 300 +mesh_max: 420, 290 probe_count: 5,4 mesh_pps: 2,2 fade_end: 5 @@ -65,7 +65,7 @@ full_steps_per_rotation: 200 endstop_pin: ^PC10 position_min: -20 position_endstop: -20 -position_max: 475 +position_max: 400 homing_speed: 100 homing_retract_dist: 10 step_pulse_duration:0.0000025 @@ -152,8 +152,9 @@ heater_pin: PD12 sensor_type: Generic 3950 sensor_pin: PC0 max_power: 1.0 -min_temp: 0 -max_temp: 150 +min_temp: -20 +max_temp: 140 +overshoot: 10 # control: pid # pid_kp: 40.673 # pid_ki: 0.837 @@ -170,8 +171,9 @@ heater_pin: PD15 max_power: 1.0 sensor_type: Generic 3950 sensor_pin: PC3 -min_temp: 0 -max_temp: 80 +min_temp: -20 +max_temp: 70 +overshoot: 10 # control: pid # pid_kp: 30.68 # pid_ki: 0.21 @@ -203,7 +205,7 @@ kick_start_time: 1.0 pin: PC6 max_power: 0.8 heater: -stepper: stepper_x, stepper_z, dual_carriage +stepper: stepper_x, stepper_z, dual_carriage idle_speed: 0.5 [delayed_gcode INIT_LIGHT] @@ -298,8 +300,9 @@ max_extrude_only_accel: 1000.0 max_extrude_cross_section:5 heater_pin: L_tool:PA8 max_power: 1.0 -min_temp: 0 +min_temp: -20 max_temp: 450 +overshoot: 20 min_extrude_temp: 150 pressure_advance: 0.032 pressure_advance_smooth_time:0.040 @@ -391,8 +394,9 @@ max_extrude_only_accel: 1000.0 max_extrude_cross_section:5 heater_pin: R_tool:PA8 max_power: 1.0 -min_temp: 0 +min_temp: -20 max_temp: 450 +overshoot: 20 min_extrude_temp: 150 pressure_advance: 0.032 pressure_advance_smooth_time:0.040 @@ -442,7 +446,10 @@ gcode: [gcode_macro T0] gcode: - {% set filament_insert = printer["filament_switch_sensor extruder"].filament_detected|default(False) %} + {% set client = printer['gcode_macro _CLIENT_VARIABLE']|default({}) %} + {% set filament_insert = True if client.filament_sensor|default("") == "" + else True if not printer[client.filament_sensor].enabled + else printer[client.filament_sensor].filament_detected|default(False) %} {% set printing = printer.print_stats.state == "printing" %} {% if filament_insert or printing == False %} {% if "x" not in printer.toolhead.homed_axes %} @@ -490,7 +497,10 @@ gcode: {% set y_offset = svv.nozzle_y_offset_val|default(0)|float %} {% set z_offset = svv.nozzle_z_offset_val|default(0)|float %} - {% set filament_insert = printer["filament_switch_sensor extruder1"].filament_detected|default(False) %} + {% set client = printer['gcode_macro _CLIENT_VARIABLE']|default({}) %} + {% set filament_insert = True if client.filament_sensor1|default("") == "" + else True if not printer[client.filament_sensor1].enabled + else printer[client.filament_sensor1].filament_detected|default(False) %} {% set printing = (printer.print_stats.state == "printing") %} {% if filament_insert or printing == False %} {% if "x" not in printer.toolhead.homed_axes %} @@ -838,13 +848,14 @@ gcode: [gcode_macro _USER_PAUSE] gcode: - {% set extruderTools = [('extruder', 'last_extruder_temp'), - ('extruder1', 'last_extruder1_temp')] %} + {% set heaters = [('extruder', 'last_extruder_temp'), + ('extruder1', 'last_extruder1_temp'), + ('heater_bed', 'last_bed_temp')] %} {% set act = printer.gcode_move.gcode_position %} SAVE_VARIABLE VARIABLE=power_resume_z VALUE={act.z} - {% for extruder_name, name in extruderTools %} - {% set temp = printer[extruder_name].target if extruder_name in printer else 0 %} - {% set restore = False if printer[extruder_name] == '' + {% for heater, name in heaters %} + {% set temp = printer[heater].target if heater in printer else 0 %} + {% set restore = False if printer[heater] == '' else True if params.RESTORE|default(1)|int == 1 else False %} SET_GCODE_VARIABLE MACRO=RESUME VARIABLE={name} VALUE="{{'restore': restore, 'temp': temp}}" {% endfor %} @@ -864,6 +875,10 @@ gcode: {% set extruder_info = [ {'index': 0, 'name': 'last_extruder_temp'}, {'index': 1, 'name': 'last_extruder1_temp'}] %} + {% set value = printer["gcode_macro RESUME"]["last_bed_temp"].temp %} + {% if value != 0 %} + M190 S{value} + {% endif %} {% set temperature = "last_extruder_temp" if printer.toolhead.extruder == "extruder" else "last_extruder1_temp" %} {% set value = printer["gcode_macro RESUME"][temperature].temp %} {% for info in extruder_info %} @@ -980,6 +995,7 @@ description: Resume the actual running print rename_existing: RESUME_BASE variable_last_extruder_temp: {'restore': False, 'temp': 0} variable_last_extruder1_temp: {'restore': False, 'temp': 0} +variable_last_bed_temp: {'restore': False, 'temp': 0} variable_restore_idle_timeout: 0 variable_idle_state: False variable_resume_dual: False @@ -1146,9 +1162,9 @@ gcode: RUN_SHELL_COMMAND CMD=_CLEAR_PLR SAVE_VARIABLE VARIABLE=last_file VALUE='"{ filename }"' SAVE_VARIABLE VARIABLE=filepath VALUE='"{ filepath }"' - {% set zero_vars = ['power_resume_x', 'power_resume_y', 'power_resume_z'] %} + {% set zero_vars = ['power_resume_position', 'power_resume_line'] %} {% for var in zero_vars %} - SAVE_VARIABLE VARIABLE={var} VALUE=0 + SAVE_VARIABLE VARIABLE={var} VALUE=0 {% endfor %} SAVE_VARIABLE VARIABLE=was_interrupted VALUE=False @@ -1164,9 +1180,9 @@ gcode: {% set park_dz = client.custom_park_dz|default(2.0)|abs %} RESPOND TYPE=command MSG="action:prompt_end" SET_GCODE_OFFSET Z=0 MOVE=0 - {% set z_height = params.Z_HEIGHT|default(sv.power_resume_z)|float %} {% set is_paused = sv.power_loss_paused|default(False) %} - {% set last_file = params.GCODE_FILE|default(sv.last_file)|string %} + {% set filepath = params.GCODE_FILE|default(sv.filepath)|string %} + {% set last_file = filepath.split('/')[-1] %} {% set hotend = sv.power_resume_extruder|default("extruder")%} {% set z_offset = sv.nozzle_z_offset_val|default(0)|float %} {% set z_offset_total = park_dz if is_paused else 0 %} @@ -1176,7 +1192,7 @@ gcode: SET_STEPPER_ENABLE STEPPER=stepper_z ENABLE=1 G4 P300 M118 Recovery in progress, please wait - RUN_SHELL_COMMAND CMD=_POWER_LOSS_RECOVERY PARAMS="{z_height} \"{last_file}\" \"{z_offset_total}\"" + RUN_SHELL_COMMAND CMD=_POWER_LOSS_RECOVERY PARAMS="{z_offset_total}" SDCARD_PRINT_FILE FILENAME=.plr/"{last_file}" SAVE_VARIABLE VARIABLE=was_interrupted VALUE=False diff --git a/printer_config/module/door_detect.cfg b/printer_config/module/door_detect.cfg new file mode 100644 index 00000000..bbafd803 --- /dev/null +++ b/printer_config/module/door_detect.cfg @@ -0,0 +1,32 @@ +[gcode_button _door_detection] +pin: DOOR_PIN +press_gcode: +release_gcode: + {% set sv = printer.save_variables.variables %} + {% set door_function = sv.door_detect|default("Disabled") %} + {% if door_function != "Disabled" %} + M118 Printer door is opening! + {% endif %} + _DOOR_DETECTION_HANDLE STATUS='open' + +[gcode_macro _DOOR_DETECTION_HANDLE] +gcode: + {% set sv = printer.save_variables.variables %} + {% set door_function = sv.door_detect|default("Disabled") %} + {% set status = params.STATUS|default("close") %} + {% set printing_state = printer.print_stats.state %} + {% if status=='open' and printing_state == 'printing' %} + {% if door_function == 'Emergency Stop' %} + M112 + {% elif door_function == 'Pause Print' %} + PAUSE + {% endif %} + {% endif %} + +[gcode_macro _DOOR_START_PRINT_BASE] +description: Call handle door is open when starting to print +gcode: + RESPOND TYPE=command MSG="action:prompt_begin" + RESPOND TYPE=command MSG="action:prompt_text Printer door is opened. Please close the door and then start printing." + RESPOND TYPE=command MSG="action:prompt_footer_button Ok|RESPOND TYPE=command MSG=action:prompt_end" + RESPOND TYPE=command MSG="action:prompt_show" diff --git a/screen.py b/screen.py index d3196e79..be0bfe56 100755 --- a/screen.py +++ b/screen.py @@ -66,7 +66,7 @@ class KlipperScreen(Gtk.Window): _ws = None screensaver_timeout = None reinit_count = 0 - max_retries = 4 + max_retries = 14 initialized = initializing = False popup_timeout = None wayland = False