From 4be47eb9aa8d367046b364eae39b4b4280377c98 Mon Sep 17 00:00:00 2001 From: Desuuuu Date: Sat, 19 Sep 2020 17:08:30 +0200 Subject: [PATCH] add configuration sanity checks at startup * Configuration issues will now be reported at startup * `[bed_mesh]`, `[probe]` and `[fan]` sections are now optional * `[pause_resume]` section no longer needs to be set explicitly --- .../extras/t5uid1/dgus_reloaded/routines.cfg | 23 +++++++- .../extras/t5uid1/dgus_reloaded/vars_in.cfg | 4 +- .../extras/t5uid1/dgus_reloaded/vars_out.cfg | 15 +++-- klippy/extras/t5uid1/t5uid1.py | 58 ++++++++++--------- 4 files changed, 64 insertions(+), 36 deletions(-) diff --git a/klippy/extras/t5uid1/dgus_reloaded/routines.cfg b/klippy/extras/t5uid1/dgus_reloaded/routines.cfg index 8807c843..b570f728 100644 --- a/klippy/extras/t5uid1/dgus_reloaded/routines.cfg +++ b/klippy/extras/t5uid1/dgus_reloaded/routines.cfg @@ -171,7 +171,7 @@ script: {% do set_variable("wait_return", "leveling_manual") %} G28 {% do start_routine("show_wait_screen") %} - {% else %} + {% elif 'bed_mesh' in printer %} BED_MESH_PROFILE SAVE=t5uid1_mesh_backup BED_MESH_CLEAR {% endif %} @@ -181,10 +181,27 @@ run_as_gcode: true trigger: leave page: leveling_manual script: - BED_MESH_PROFILE LOAD=t5uid1_mesh_backup - BED_MESH_PROFILE REMOVE=t5uid1_mesh_backup + {% if 'bed_mesh' in printer %} + BED_MESH_PROFILE LOAD=t5uid1_mesh_backup + BED_MESH_PROFILE REMOVE=t5uid1_mesh_backup + {% endif %} run_as_gcode: true +[t5uid1_routine __leveling_automatic] +trigger: enter_pre +page: leveling_automatic +script: + {% if is_busy() %} + {% do set_message("Busy") %} + { abort_page_switch() } + {% elif 'bed_mesh' not in printer %} + {% do set_message("Missing config: bed_mesh") %} + { abort_page_switch() } + {% elif 'probe' not in printer %} + {% do set_message("Missing config: probe") %} + { abort_page_switch() } + {% endif %} + [t5uid1_routine __filament] trigger: enter_pre page: filament diff --git a/klippy/extras/t5uid1/dgus_reloaded/vars_in.cfg b/klippy/extras/t5uid1/dgus_reloaded/vars_in.cfg index 5a68d472..c712fa58 100644 --- a/klippy/extras/t5uid1/dgus_reloaded/vars_in.cfg +++ b/klippy/extras/t5uid1/dgus_reloaded/vars_in.cfg @@ -313,7 +313,7 @@ script: {% do set_message("Homing required") %} {% elif is_busy() %} {% do set_message("Busy") %} - {% else %} + {% elif 'bed_mesh' in printer %} BED_MESH_CALIBRATE G28 Z {% do start_routine("show_probing_screen") %} @@ -327,7 +327,7 @@ data_type: none script: {% if is_busy() %} {% do set_message("Busy") %} - {% else %} + {% elif 'bed_mesh' in printer %} BED_MESH_CLEAR BED_MESH_PROFILE REMOVE=default {% do start_routine("trigger_full_update") %} diff --git a/klippy/extras/t5uid1/dgus_reloaded/vars_out.cfg b/klippy/extras/t5uid1/dgus_reloaded/vars_out.cfg index 281c2daa..2c3c4e62 100644 --- a/klippy/extras/t5uid1/dgus_reloaded/vars_out.cfg +++ b/klippy/extras/t5uid1/dgus_reloaded/vars_out.cfg @@ -204,7 +204,7 @@ address: 0x3108 data_type: uint16 script: {% set t5uid1 = printer.t5uid1 %} - {% if printer.bed_mesh.profile_name != "" %} + {% if 'bed_mesh' in printer and printer.bed_mesh.profile_name != "" %} {% do enable_control(t5uid1.pages.leveling_automatic, t5uid1.control_types.return_key_code, t5uid1.controls.disable) %} @@ -222,8 +222,10 @@ address: 0x3109 data_type: array[int16] array_len: 25 script: - {% set grid = printer.bed_mesh.probed_matrix %} - {% if not grid or grid|length < 5 %} + {% if 'bed_mesh' in printer %} + {% set grid = printer.bed_mesh.probed_matrix %} + {% endif %} + {% if grid is not defined or grid|length < 5 %} {% set grid = [] %} {% for i in range(5) %} {% do grid.append([0, 0, 0, 0, 0]) %} @@ -446,7 +448,12 @@ script: type: output address: 0x4000 data_type: uint16 -script: { (printer.fan.speed * 100)|round|int } +script: + {% if 'fan' in printer %} + { (printer.fan.speed * 100)|round|int } + {% else %} + { "0" } + {% endif %} [t5uid1_var volume] type: output diff --git a/klippy/extras/t5uid1/t5uid1.py b/klippy/extras/t5uid1/t5uid1.py index be45ed46..75a09d41 100644 --- a/klippy/extras/t5uid1/t5uid1.py +++ b/klippy/extras/t5uid1/t5uid1.py @@ -98,8 +98,13 @@ class T5UID1: self.gcode = self.printer.lookup_object('gcode') self.configfile = self.printer.lookup_object('configfile') - self.stepper_enable = self.heaters = self.bed_mesh = None - self.toolhead = self.probe = self.pause_resume = None + self.toolhead = None + self.heaters = self.printer.load_object(config, 'heaters') + self.pause_resume = self.printer.load_object(config, 'pause_resume') + self.stepper_enable = self.printer.load_object(config, 'stepper_enable') + self.bed_mesh = None + self.probe = None + self.extruders = {} self.mcu = mcu.get_printer_mcu(self.printer, @@ -330,16 +335,35 @@ class T5UID1: "t5uid1_received") def _handle_ready(self): + self.toolhead = self.printer.lookup_object('toolhead') + + self.heaters.lookup_heater('extruder') + self.heaters.lookup_heater('heater_bed') + + try: + self.bed_mesh = self.printer.lookup_object(config, 'bed_mesh') + except Exception: + logging.debug("No 'bed_mesh' configuration found") + self.bed_mesh = None + + try: + self.probe = self.printer.lookup_object(config, 'probe') + except Exception: + logging.debug("No 'probe' configuration found") + self.probe = None + has_bltouch = False try: self.printer.lookup_object('bltouch') has_bltouch = True except Exception: pass + self._status_data.update({ 'limits': self.limits(), 'has_bltouch': has_bltouch }) + self._is_connected = True self.reactor.register_timer(self._on_ready, self.reactor.NOW) @@ -499,11 +523,6 @@ class T5UID1: def check_paused(self): if not self._is_printing: return - if self.pause_resume is None: - try: - self.pause_resume = self.printer.lookup_object('pause_resume') - except Exception: - return curtime = self.reactor.monotonic() if self._print_pause_time < 0 and self.pause_resume.is_paused: self._print_pause_time = curtime @@ -700,37 +719,29 @@ class T5UID1: self.configfile.set(self.name, 'volume', volume) def all_steppers_enabled(self): - if self.stepper_enable is None: - self.stepper_enable = self.printer.lookup_object('stepper_enable') res = True for name in ['stepper_x', 'stepper_y', 'stepper_z']: res &= self.stepper_enable.lookup_enable(name).is_motor_enabled() return res def heater_min_temp(self, heater): - if self.heaters is None: - self.heaters = self.printer.lookup_object('heaters') try: return self.heaters.lookup_heater(heater).min_temp except Exception: return 0 def heater_max_temp(self, heater, margin=0): - if self.heaters is None: - self.heaters = self.printer.lookup_object('heaters') try: return max(0, self.heaters.lookup_heater(heater).max_temp - margin) except Exception: return 0 def heater_min_extrude_temp(self, heater): - if self.heaters is None: - self.heaters = self.printer.lookup_object('heaters') return self.heaters.lookup_heater(heater).min_extrude_temp def probed_matrix(self): if self.bed_mesh is None: - self.bed_mesh = self.printer.lookup_object('bed_mesh') + return 0 count = len(self.bed_mesh.bmc.probe_helper.results) points_map = [ 0, 1, 2, 3, 4, 9, 8, 7, 6, 5, @@ -749,8 +760,6 @@ class T5UID1: def pid_param(self, heater, param): if param not in ['p', 'i', 'd']: raise ValueError("Invalid param") - if self.heaters is None: - self.heaters = self.printer.lookup_object('heaters') try: return getattr(self.heaters.lookup_heater(heater).control, 'K' + param) * heaters.PID_PARAM_BASE @@ -770,8 +779,6 @@ class T5UID1: return 0 def limits(self): - if self.toolhead is None: - self.toolhead = self.printer.lookup_object('toolhead') kin = self.toolhead.get_kinematics() x_min, x_max = kin.rails[0].get_range() y_min, y_max = kin.rails[1].get_range() @@ -801,18 +808,15 @@ class T5UID1: self.start_routine('message_timeout') def is_busy(self): - if self.toolhead is None: - self.toolhead = self.printer.lookup_object('toolhead') - if self.probe is None: - self.probe = self.printer.lookup_object('probe') eventtime = self.reactor.monotonic() print_time, est_print_time, lookahead_empty = self.toolhead.check_busy( eventtime) idle_time = est_print_time - print_time - return (not lookahead_empty + if (not lookahead_empty or idle_time < 1.0 - or self.gcode.get_mutex().test() - or self.probe.multi_probe_pending) + or self.gcode.get_mutex().test()): + return True + return (self.probe is not None and self.probe.multi_probe_pending) def cmd_DGUS_ABORT_PAGE_SWITCH(self, gcmd): pass