Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/Klipper3d/klipper.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStefan Dej <meteyou@gmail.com>2022-10-05 22:02:28 +0300
committerGitHub <noreply@github.com>2022-10-05 22:02:28 +0300
commitb0ffb269d2ac8dc19ae6879d80718b8c60ab60de (patch)
tree5cbe91c7c1ba712a8b5ebcd20565e80f7514f566
parenta2482d4f952e0ffd908e4381cae9e45ab1148773 (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.md12
-rw-r--r--docs/Status_Reference.md8
-rw-r--r--klippy/extras/print_stats.py29
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):