Merge commit 'b4687e88932458b36d1e8c3600fedb18cd73259d' into release

This commit is contained in:
张开科 2025-05-10 14:05:21 +08:00
commit 4511514312
21 changed files with 612 additions and 203 deletions

View File

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

View File

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

View File

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

View File

@ -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 <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\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 ""

View File

@ -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) <https://hosted.weblate.org/projects/"
@ -77,6 +77,9 @@ msgstr "激活"
msgid "Adaptive Bed Leveling"
msgstr "自适应床调平"
msgid "Add"
msgstr "加"
msgid "Add profile"
msgstr "添加配置文件"
@ -293,6 +296,9 @@ msgstr "关闭电机"
msgid "Disable for 12hs with am / pm"
msgstr "在十二小时显示模式中不现实AM/PM"
msgid "Disabled"
msgstr "禁用"
msgid "Disconnect"
msgstr "断开"
@ -307,6 +313,9 @@ msgstr "您要忘记或断开%s的连接吗?"
msgid "Do you want to recover %s?"
msgstr "你想恢复 %s 吗?"
msgid "Door Open Protection Mode"
msgstr "开门保护模式"
msgid "Elapsed trial time:"
msgstr "已用时间:"
@ -322,9 +331,6 @@ msgstr "启用注册码"
msgid "Enable screen power management"
msgstr "开启屏幕功率管理功能"
msgid "Enabled successfully"
msgstr "启用成功"
msgid "Error"
msgstr "错误"
@ -644,6 +650,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 "此操作即将开始打印模型"
@ -1228,6 +1251,15 @@ msgid "second"
msgid_plural "seconds"
msgstr[0] "秒"
#~ msgid "Enabled successfully"
#~ msgstr "启用成功"
#~ msgid "Reset"
#~ msgstr "重置"
#~ msgid "Reset successfully"
#~ msgstr "重置成功"
#~ msgid "Connected"
#~ msgstr "已连接"
@ -1344,9 +1376,6 @@ msgstr[0] "秒"
#~ msgid "Homing"
#~ msgstr "归零"
#~ msgid "Disable XY"
#~ msgstr "关闭 XY 轴电机"
#~ msgid "Slicer Time correction (%)"
#~ msgstr "切片软件时间校正(%)"

View File

@ -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-01 12:09+0000\n"
"Last-Translator: 峻瑜哥 <a728728728@gmail.com>\n"
"Language-Team: Chinese (Traditional) <https://hosted.weblate.org/projects/"
@ -77,6 +77,9 @@ msgstr "激活"
msgid "Adaptive Bed Leveling"
msgstr "自適應床調平"
msgid "Add"
msgstr "加"
msgid "Add profile"
msgstr "新增設定檔案"
@ -293,6 +296,9 @@ msgstr "關閉電機"
msgid "Disable for 12hs with am / pm"
msgstr "在十二小時顯示模式中不顯示AM/PM"
msgid "Disabled"
msgstr "禁用"
msgid "Disconnect"
msgstr "断开"
@ -307,6 +313,9 @@ msgstr "您要忘記或斷開%s的連接嗎?"
msgid "Do you want to recover %s?"
msgstr "你想恢復 %s 嗎?"
msgid "Door Open Protection Mode"
msgstr "開門保護模式"
msgid "Elapsed trial time:"
msgstr "已用時間"
@ -322,9 +331,6 @@ msgstr "啟用註冊碼"
msgid "Enable screen power management"
msgstr "開啟螢幕功率管理功能"
msgid "Enabled successfully"
msgstr "啟用成功"
msgid "Error"
msgstr "錯誤"
@ -644,6 +650,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 "此操作即將開始打印模型"
@ -1228,6 +1251,15 @@ msgid "second"
msgid_plural "seconds"
msgstr[0] "秒"
#~ msgid "Enabled successfully"
#~ msgstr "啟用成功"
#~ msgid "Reset"
#~ msgstr "重置"
#~ msgid "Reset successfully"
#~ msgstr "重置成功"
#~ msgid "Connected"
#~ msgstr "已連線"
@ -1314,9 +1346,6 @@ msgstr[0] "秒"
#~ msgid "Homing"
#~ msgstr "归零"
#~ msgid "Disable XY"
#~ msgstr "关闭 XY 轴电机"
#~ msgid "Slicer Time correction (%)"
#~ msgstr "切片软件时间校正(%)"

View File

@ -13,4 +13,10 @@ prompts_text = [
_("Left extruder detects no filament, please load filament and continue."),
_("Right extruder detects no filament, please load filament and continue."),
_("Ok"),
_("Disabled"),
_("Pause Print"),
_("Printer door is opening!"),
_("Printer door is opened. Please close the door and then start printing."),
_("Please close the door and click Resume to proceed.")
]

View File

@ -35,7 +35,15 @@ class RegistrationInterface(DbusInterfaceCommonAsync, interface_name="org.regist
raise NotImplementedError
@dbus_method_async(input_signature="s", result_signature="b")
async def reset_registration(self, val: str) -> 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

View File

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

View File

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

View File

@ -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"<big>{status_text}</big>\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)

View File

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

View File

@ -0,0 +1 @@
../../module/door_detect.cfg

View File

@ -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"
SDCARD_PRINT_FILE FILENAME=".PresetModel/NozzleAglin.gcode"
[include module/*.cfg]

View File

@ -0,0 +1 @@
../../module/door_detect.cfg

View File

@ -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"
SDCARD_PRINT_FILE FILENAME=".PresetModel/NozzleAglin.gcode"
[include module/*.cfg]

View File

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

View File

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

View File

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