diff --git a/config/model_menu.conf b/config/model_menu.conf index 126cc0aa..1de5b6dc 100644 --- a/config/model_menu.conf +++ b/config/model_menu.conf @@ -1,6 +1,20 @@ -CreatBot_F430NX -CreatBot_D600Pro2HS -CreatBot_D600Pro2HS_KIT -CreatBot_D1000HS -CreatBot_D1000HS_KIT -CreatBot_P800 + +[CreatBot_F430NX] +versions = 1.0 + +[CreatBot_D600Pro2HS] +versions = 1.0, 1.1 +#V1.1 Add door detection + +[CreatBot_D600Pro2HS_KIT] +versions = 1.0 + +[CreatBot_D1000HS] +versions = 1.0, 1.1 +#V1.1 Add door detection + +[CreatBot_D1000HS_KIT] +versions = 1.0 + +[CreatBot_P800] +versions = 1.0 diff --git a/ks_includes/ModelConfig.py b/ks_includes/ModelConfig.py index e7ca2daf..f027cae3 100644 --- a/ks_includes/ModelConfig.py +++ b/ks_includes/ModelConfig.py @@ -100,7 +100,7 @@ class ModelConfig: f"Configuration file {self.klipperscreen_config_path} not found." ) - def wirte_printer_config(self, device_name): + def wirte_printer_config(self, device_name, version): config_dict = { "CreatBot_F430NX": "CreatBot_F430NX", "CreatBot_D600Pro2HS": "CreatBot_D600Pro2", @@ -128,6 +128,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] @@ -151,13 +166,13 @@ 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 model_name = model_name.split("_")[1] device_name = self.generate_machine_name(model_name) self.write_mdns_config(device_name) self.write_device_name_config(device_name) - self.wirte_printer_config(model) + 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/panels/factory_settings.py b/panels/factory_settings.py index 786ef4ef..97b4143a 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,52 @@ 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 + + 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.select_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 +170,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 +180,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 +194,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)