| 
									
										
										
										
											2020-07-31 15:23:03 -04:00
										 |  |  | # Virtual SDCard print stat tracking | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | # Copyright (C) 2020  Eric Callahan <arksine.code@gmail.com> | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | # This file may be distributed under the terms of the GNU GPLv3 license. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class PrintStats: | 
					
						
							|  |  |  |     def __init__(self, config): | 
					
						
							|  |  |  |         printer = config.get_printer() | 
					
						
							| 
									
										
										
										
											2020-08-17 00:05:41 -04:00
										 |  |  |         self.gcode_move = printer.load_object(config, 'gcode_move') | 
					
						
							| 
									
										
										
										
											2020-07-31 15:23:03 -04:00
										 |  |  |         self.reactor = printer.get_reactor() | 
					
						
							|  |  |  |         self.reset() | 
					
						
							|  |  |  |     def _update_filament_usage(self, eventtime): | 
					
						
							| 
									
										
										
										
											2020-08-05 11:43:45 -04:00
										 |  |  |         gc_status = self.gcode_move.get_status(eventtime) | 
					
						
							| 
									
										
										
										
											2020-08-15 16:07:07 -04:00
										 |  |  |         cur_epos = gc_status['position'].e | 
					
						
							| 
									
										
										
										
											2020-07-31 15:23:03 -04:00
										 |  |  |         self.filament_used += (cur_epos - self.last_epos) \ | 
					
						
							|  |  |  |             / gc_status['extrude_factor'] | 
					
						
							|  |  |  |         self.last_epos = cur_epos | 
					
						
							|  |  |  |     def set_current_file(self, filename): | 
					
						
							|  |  |  |         self.reset() | 
					
						
							|  |  |  |         self.filename = filename | 
					
						
							|  |  |  |     def note_start(self): | 
					
						
							|  |  |  |         curtime = self.reactor.monotonic() | 
					
						
							|  |  |  |         if self.print_start_time is None: | 
					
						
							|  |  |  |             self.print_start_time = curtime | 
					
						
							|  |  |  |         elif self.last_pause_time is not None: | 
					
						
							|  |  |  |             # Update pause time duration | 
					
						
							|  |  |  |             pause_duration = curtime - self.last_pause_time | 
					
						
							|  |  |  |             self.prev_pause_duration += pause_duration | 
					
						
							|  |  |  |             self.last_pause_time = None | 
					
						
							|  |  |  |         # Reset last e-position | 
					
						
							| 
									
										
										
										
											2020-08-05 11:43:45 -04:00
										 |  |  |         gc_status = self.gcode_move.get_status(curtime) | 
					
						
							| 
									
										
										
										
											2020-08-15 16:07:07 -04:00
										 |  |  |         self.last_epos = gc_status['position'].e | 
					
						
							| 
									
										
										
										
											2020-08-03 12:21:56 -04:00
										 |  |  |         self.state = "printing" | 
					
						
							|  |  |  |         self.error_message = "" | 
					
						
							| 
									
										
										
										
											2020-07-31 15:23:03 -04:00
										 |  |  |     def note_pause(self): | 
					
						
							|  |  |  |         if self.last_pause_time is None: | 
					
						
							|  |  |  |             curtime = self.reactor.monotonic() | 
					
						
							|  |  |  |             self.last_pause_time = curtime | 
					
						
							|  |  |  |             # update filament usage | 
					
						
							|  |  |  |             self._update_filament_usage(curtime) | 
					
						
							| 
									
										
										
										
											2020-08-03 12:21:56 -04:00
										 |  |  |         if self.state != "error": | 
					
						
							|  |  |  |             self.state = "paused" | 
					
						
							|  |  |  |     def note_error(self, message): | 
					
						
							|  |  |  |         self.state = "error" | 
					
						
							|  |  |  |         self.error_message = message | 
					
						
							|  |  |  |     def note_complete(self): | 
					
						
							|  |  |  |         self.state = "complete" | 
					
						
							|  |  |  |         eventtime = self.reactor.monotonic() | 
					
						
							|  |  |  |         self.total_duration = eventtime - self.print_start_time | 
					
						
							|  |  |  |         self.print_start_time = None | 
					
						
							| 
									
										
										
										
											2020-07-31 15:23:03 -04:00
										 |  |  |     def reset(self): | 
					
						
							| 
									
										
										
										
											2020-08-03 12:21:56 -04:00
										 |  |  |         self.filename = self.error_message = "" | 
					
						
							|  |  |  |         self.state = "standby" | 
					
						
							| 
									
										
										
										
											2020-07-31 15:23:03 -04:00
										 |  |  |         self.prev_pause_duration = self.last_epos = 0. | 
					
						
							| 
									
										
										
										
											2020-08-03 12:21:56 -04:00
										 |  |  |         self.filament_used = self.total_duration = 0. | 
					
						
							| 
									
										
										
										
											2020-07-31 15:23:03 -04:00
										 |  |  |         self.print_start_time = self.last_pause_time = None | 
					
						
							|  |  |  |     def get_status(self, eventtime): | 
					
						
							|  |  |  |         time_paused = self.prev_pause_duration | 
					
						
							|  |  |  |         if self.print_start_time is not None: | 
					
						
							|  |  |  |             if self.last_pause_time is not None: | 
					
						
							|  |  |  |                 # Calculate the total time spent paused during the print | 
					
						
							|  |  |  |                 time_paused += eventtime - self.last_pause_time | 
					
						
							|  |  |  |             else: | 
					
						
							|  |  |  |                 # Accumulate filament if not paused | 
					
						
							|  |  |  |                 self._update_filament_usage(eventtime) | 
					
						
							| 
									
										
										
										
											2020-08-03 12:21:56 -04:00
										 |  |  |             self.total_duration = eventtime - self.print_start_time | 
					
						
							| 
									
										
										
										
											2020-07-31 15:23:03 -04:00
										 |  |  |         return { | 
					
						
							|  |  |  |             'filename': self.filename, | 
					
						
							| 
									
										
										
										
											2020-08-03 12:21:56 -04:00
										 |  |  |             'total_duration': self.total_duration, | 
					
						
							|  |  |  |             'print_duration': self.total_duration - time_paused, | 
					
						
							|  |  |  |             'filament_used': self.filament_used, | 
					
						
							|  |  |  |             'state': self.state, | 
					
						
							|  |  |  |             'message': self.error_message | 
					
						
							| 
									
										
										
										
											2020-07-31 15:23:03 -04:00
										 |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def load_config(config): | 
					
						
							|  |  |  |     return PrintStats(config) |