From f082d4dd44fad6afb70849f1fedd77e71e001e52 Mon Sep 17 00:00:00 2001
From: Arksine <arksine.code@gmail.com>
Date: Fri, 31 Jul 2020 15:46:03 -0400
Subject: [PATCH] paneldue:  Update to fetch status from Klipper's print_stats
 object

Signed-off-by:  Eric Callahan <arksine.code@gmail.com>
---
 moonraker/plugins/paneldue.py | 23 ++++++++++++-----------
 1 file changed, 12 insertions(+), 11 deletions(-)

diff --git a/moonraker/plugins/paneldue.py b/moonraker/plugins/paneldue.py
index 0f3c6ef..347a7fa 100644
--- a/moonraker/plugins/paneldue.py
+++ b/moonraker/plugins/paneldue.py
@@ -260,8 +260,9 @@ class PanelDue:
         # Initalize printer state and make subscription request
         self.printer_state = {
             'gcode': {}, 'toolhead': {}, 'virtual_sdcard': {},
-            'pause_resume': {}, 'fan': {}, 'display_status': {}}
-        sub_args = {'gcode': [], 'toolhead': []}
+            'pause_resume': {}, 'fan': {}, 'display_status': {},
+            'print_stats': {}}
+        sub_args = {k: [] for k in self.printer_state.keys()}
         self.extruder_count = 0
         self.heaters = []
         for cfg in config:
@@ -274,8 +275,6 @@ class PanelDue:
                 self.printer_state[cfg] = {}
                 self.heaters.append(cfg)
                 sub_args[cfg] = []
-            elif cfg in self.printer_state:
-                sub_args[cfg] = []
         try:
             await self._klippy_request(
                 "objects/subscription", method='POST', args=sub_args)
@@ -400,7 +399,7 @@ class PanelDue:
 
     def _prepare_M32(self, args):
         filename = self._clean_filename(args[0].strip())
-        return "M23 " + filename + "\n" + "M24"
+        return "SDCARD_PRINT_FILE FILENAME=" + filename
 
     def _prepare_M98(self, args):
         macro = args[0][1:].strip()
@@ -498,13 +497,14 @@ class PanelDue:
 
         # Print Progress Tracking
         sd_status = p_state['virtual_sdcard']
-        fname = sd_status.get('filename', "")
+        print_stats = p_state['print_stats']
+        fname = print_stats.get('filename', "")
         if fname:
             # We know a file has been loaded, initialize metadata
             if self.current_file != fname:
                 self.current_file = fname
                 self.file_metadata = self.file_manager.get_file_metadata(fname)
-            progress = p_state['virtual_sdcard'].get('progress', 0)
+            progress = sd_status.get('progress', 0)
             # progress and print tracking
             if progress:
                 response['fraction_printed'] = round(progress, 3)
@@ -515,7 +515,7 @@ class PanelDue:
                     # filament estimate
                     est_total_fil = self.file_metadata.get('filament_total')
                     if est_total_fil:
-                        cur_filament = sd_status.get('filament_used', 0.)
+                        cur_filament = print_stats.get('filament_used', 0.)
                         fpct = min(1., cur_filament / est_total_fil)
                         times_left.append(int(est_time - est_time * fpct))
                     # object height estimate
@@ -527,7 +527,7 @@ class PanelDue:
                 else:
                     # The estimated time is not in the metadata, however we
                     # can still provide an estimate based on file progress
-                    duration = sd_status.get('print_duration', 0.)
+                    duration = print_stats.get('print_duration', 0.)
                     times_left = [int(duration / progress - duration)]
                 response['timesLeft'] = times_left
         else:
@@ -630,12 +630,13 @@ class PanelDue:
         response = {}
         filename = arg_p
         sd_status = self.printer_state.get('virtual_sdcard', {})
+        print_stats = self.printer_state.get('print_stats', {})
         if filename is None:
             # PanelDue is requesting file information on a
             # currently printed file
             active = False
-            if sd_status:
-                filename = sd_status['filename']
+            if sd_status and print_stats:
+                filename = print_stats['filename']
                 active = sd_status['is_active']
             if not filename or not active:
                 # Either no file printing or no virtual_sdcard