diff options
author | Stefan Dej <meteyou@gmail.com> | 2022-10-05 22:02:28 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-10-05 22:02:28 +0300 |
commit | b0ffb269d2ac8dc19ae6879d80718b8c60ab60de (patch) | |
tree | 5cbe91c7c1ba712a8b5ebcd20565e80f7514f566 | |
parent | a2482d4f952e0ffd908e4381cae9e45ab1148773 (diff) |
print_stats: add `SET_PRINT_STATS_INFO` G-Code for pass slicer variables to Klipper (#5726)
This adds a gcode command that can be used insight the slicer to pass the total layer count and current layer information.
Signed-off-by: Stefan Dej <meteyou@gmail.com>
-rw-r--r-- | docs/G-Codes.md | 12 | ||||
-rw-r--r-- | docs/Status_Reference.md | 8 | ||||
-rw-r--r-- | klippy/extras/print_stats.py | 29 |
3 files changed, 46 insertions, 3 deletions
diff --git a/docs/G-Codes.md b/docs/G-Codes.md index 3e4e177f6..d9cefd80b 100644 --- a/docs/G-Codes.md +++ b/docs/G-Codes.md @@ -888,6 +888,18 @@ the paused state is fresh for each print. #### CANCEL_PRINT `CANCEL_PRINT`: Cancels the current print. +### [print_stats] + +The print_stats module is automatically loaded. + +#### SET_PRINT_STATS_INFO +`SET_PRINT_STATS_INFO [TOTAL_LAYER=<total_layer_count>] [CURRENT_LAYER= +<current_layer>]`: Pass slicer info like layer act and total to Klipper. +Add `SET_PRINT_STATS_INFO [TOTAL_LAYER=<total_layer_count>]` to your +slicer start gcode section and `SET_PRINT_STATS_INFO [CURRENT_LAYER= +<current_layer>]` at the layer change gcode section to pass layer +information from your slicer to Klipper. + ### [probe] The following commands are available when a diff --git a/docs/Status_Reference.md b/docs/Status_Reference.md index 99d4f0f31..e6595ddbb 100644 --- a/docs/Status_Reference.md +++ b/docs/Status_Reference.md @@ -330,8 +330,12 @@ The following information is available in the `print_stats` object [virtual_sdcard](Config_Reference.md#virtual_sdcard) config section is defined): - `filename`, `total_duration`, `print_duration`, `filament_used`, - `state`, `message`: Estimated information about the current print - when a virtual_sdcard print is active. + `state`, `message`: Estimated information about the current print when a + virtual_sdcard print is active. +- `info.total_layer`: The total layer value of the last `SET_PRINT_STATS_INFO + TOTAL_LAYER=<value>` G-Code command. +- `info.current_layer`: The current layer value of the last + `SET_PRINT_STATS_INFO CURRENT_LAYER=<value>` G-Code command. ## probe diff --git a/klippy/extras/print_stats.py b/klippy/extras/print_stats.py index 9589aedea..668cd7d0c 100644 --- a/klippy/extras/print_stats.py +++ b/klippy/extras/print_stats.py @@ -10,6 +10,11 @@ class PrintStats: self.gcode_move = printer.load_object(config, 'gcode_move') self.reactor = printer.get_reactor() self.reset() + # Register commands + self.gcode = printer.lookup_object('gcode') + self.gcode.register_command( + "SET_PRINT_STATS_INFO", self.cmd_SET_PRINT_STATS_INFO, + desc=self.cmd_SET_PRINT_STATS_INFO_help) def _update_filament_usage(self, eventtime): gc_status = self.gcode_move.get_status(eventtime) cur_epos = gc_status['position'].e @@ -59,6 +64,24 @@ class PrintStats: self.init_duration = self.total_duration - \ self.prev_pause_duration self.print_start_time = None + cmd_SET_PRINT_STATS_INFO_help = "Pass slicer info like layer act and " \ + "total to klipper" + def cmd_SET_PRINT_STATS_INFO(self, gcmd): + total_layer = gcmd.get_int("TOTAL_LAYER", self.info_total_layer, \ + minval=0) + current_layer = gcmd.get_int("CURRENT_LAYER", self.info_current_layer, \ + minval=0) + if total_layer == 0: + self.info_total_layer = None + self.info_current_layer = None + elif total_layer != self.info_total_layer: + self.info_total_layer = total_layer + self.info_current_layer = 0 + + if self.info_total_layer is not None and \ + current_layer is not None and \ + current_layer != self.info_current_layer: + self.info_current_layer = min(current_layer, self.info_total_layer) def reset(self): self.filename = self.error_message = "" self.state = "standby" @@ -66,6 +89,8 @@ class PrintStats: self.filament_used = self.total_duration = 0. self.print_start_time = self.last_pause_time = None self.init_duration = 0. + self.info_total_layer = None + self.info_current_layer = None def get_status(self, eventtime): time_paused = self.prev_pause_duration if self.print_start_time is not None: @@ -86,7 +111,9 @@ class PrintStats: 'print_duration': print_duration, 'filament_used': self.filament_used, 'state': self.state, - 'message': self.error_message + 'message': self.error_message, + 'info': {'total_layer': self.info_total_layer, + 'current_layer': self.info_current_layer} } def load_config(config): |