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>
This commit is contained in:
parent
a2482d4f95
commit
b0ffb269d2
|
@ -888,6 +888,18 @@ the paused state is fresh for each print.
|
||||||
#### CANCEL_PRINT
|
#### CANCEL_PRINT
|
||||||
`CANCEL_PRINT`: Cancels the current 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]
|
### [probe]
|
||||||
|
|
||||||
The following commands are available when a
|
The following commands are available when a
|
||||||
|
|
|
@ -330,8 +330,12 @@ The following information is available in the `print_stats` object
|
||||||
[virtual_sdcard](Config_Reference.md#virtual_sdcard) config section is
|
[virtual_sdcard](Config_Reference.md#virtual_sdcard) config section is
|
||||||
defined):
|
defined):
|
||||||
- `filename`, `total_duration`, `print_duration`, `filament_used`,
|
- `filename`, `total_duration`, `print_duration`, `filament_used`,
|
||||||
`state`, `message`: Estimated information about the current print
|
`state`, `message`: Estimated information about the current print when a
|
||||||
when a virtual_sdcard print is active.
|
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
|
## probe
|
||||||
|
|
||||||
|
|
|
@ -10,6 +10,11 @@ class PrintStats:
|
||||||
self.gcode_move = printer.load_object(config, 'gcode_move')
|
self.gcode_move = printer.load_object(config, 'gcode_move')
|
||||||
self.reactor = printer.get_reactor()
|
self.reactor = printer.get_reactor()
|
||||||
self.reset()
|
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):
|
def _update_filament_usage(self, eventtime):
|
||||||
gc_status = self.gcode_move.get_status(eventtime)
|
gc_status = self.gcode_move.get_status(eventtime)
|
||||||
cur_epos = gc_status['position'].e
|
cur_epos = gc_status['position'].e
|
||||||
|
@ -59,6 +64,24 @@ class PrintStats:
|
||||||
self.init_duration = self.total_duration - \
|
self.init_duration = self.total_duration - \
|
||||||
self.prev_pause_duration
|
self.prev_pause_duration
|
||||||
self.print_start_time = None
|
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):
|
def reset(self):
|
||||||
self.filename = self.error_message = ""
|
self.filename = self.error_message = ""
|
||||||
self.state = "standby"
|
self.state = "standby"
|
||||||
|
@ -66,6 +89,8 @@ class PrintStats:
|
||||||
self.filament_used = self.total_duration = 0.
|
self.filament_used = self.total_duration = 0.
|
||||||
self.print_start_time = self.last_pause_time = None
|
self.print_start_time = self.last_pause_time = None
|
||||||
self.init_duration = 0.
|
self.init_duration = 0.
|
||||||
|
self.info_total_layer = None
|
||||||
|
self.info_current_layer = None
|
||||||
def get_status(self, eventtime):
|
def get_status(self, eventtime):
|
||||||
time_paused = self.prev_pause_duration
|
time_paused = self.prev_pause_duration
|
||||||
if self.print_start_time is not None:
|
if self.print_start_time is not None:
|
||||||
|
@ -86,7 +111,9 @@ class PrintStats:
|
||||||
'print_duration': print_duration,
|
'print_duration': print_duration,
|
||||||
'filament_used': self.filament_used,
|
'filament_used': self.filament_used,
|
||||||
'state': self.state,
|
'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):
|
def load_config(config):
|
||||||
|
|
Loading…
Reference in New Issue