Browse Source

Added PrintJob handling to ClusterUM3

CL-541
Jaime van Kessel 7 years ago
parent
commit
b1649f2d38

+ 14 - 2
cura/PrinterOutput/PrintJobOutputModel.py

@@ -5,6 +5,7 @@ from PyQt5.QtCore import pyqtSignal, pyqtProperty, QObject, QVariant
 MYPY = False
 if MYPY:
     from cura.PrinterOutput.PrinterOutputController import PrinterOutputController
+    from cura.PrinterOutput.PrinterOutputModel import PrinterOutputModel
 
 
 class PrintJobOutputModel(QObject):
@@ -13,15 +14,26 @@ class PrintJobOutputModel(QObject):
     timeElapsedChanged = pyqtSignal()
     nameChanged = pyqtSignal()
     keyChanged = pyqtSignal()
+    assignedPrinterChanged = pyqtSignal()
 
-    def __init__(self, output_controller: "PrinterOutputController", parent=None):
+    def __init__(self, output_controller: "PrinterOutputController", key: str = "", name: str = "", parent=None):
         super().__init__(parent)
         self._output_controller = output_controller
         self._state = ""
         self._time_total = 0
         self._time_elapsed = 0
         self._name = ""  # Human readable name
-        self._key = ""  # Unique identifier
+        self._key = key  # Unique identifier
+        self._assigned_printer = None
+
+    @pyqtProperty(QObject, notify=assignedPrinterChanged)
+    def assignedPrinter(self):
+        return self._assigned_printer
+
+    def updateAssignedPrinter(self, assigned_printer: "PrinterOutputModel"):
+        if self._assigned_printer != assigned_printer:
+            self._assigned_printer = assigned_printer
+            self.assignedPrinterChanged.emit()
 
     @pyqtProperty(str, notify=keyChanged)
     def key(self):

+ 4 - 0
cura/PrinterOutput/PrinterOutputModel.py

@@ -145,6 +145,10 @@ class PrinterOutputModel(QObject):
 
     def updateActivePrintJob(self, print_job):
         if self._active_print_job != print_job:
+            if self._active_print_job is not None:
+                self._active_print_job.updateAssignedPrinter(None)
+            if print_job is not None:
+                print_job.updateAssignedPrinter(self)
             self._active_print_job = print_job
             self.activePrintJobChanged.emit()
 

+ 7 - 0
cura/PrinterOutputDevice.py

@@ -60,6 +60,13 @@ class PrinterOutputDevice(QObject, OutputDevice):
     def _update(self):
         pass
 
+    def _getPrinterByKey(self, key):
+        for printer in self._printers:
+            if printer.key == key:
+                return printer
+
+        return None
+
     def requestWrite(self, nodes, file_name = None, filter_by_machine = False, file_handler = None):
         raise NotImplementedError("requestWrite needs to be implemented")
 

+ 43 - 3
plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py

@@ -7,7 +7,7 @@ from cura.PrinterOutput.MaterialOutputModel import MaterialOutputModel
 
 import json
 
-from PyQt5.QtNetwork import QNetworkRequest
+from PyQt5.QtNetwork import QNetworkRequest, QNetworkReply
 
 class ClusterUM3OutputDevice(NetworkedPrinterOutputDevice):
     def __init__(self, device_id, address, properties, parent = None):
@@ -16,17 +16,57 @@ class ClusterUM3OutputDevice(NetworkedPrinterOutputDevice):
 
         self._number_of_extruders = 2
 
+        self._print_jobs = []
+
     def _update(self):
         super()._update()
         self._get("printers/", onFinished=self._onGetPrintersDataFinished)
+        self._get("print_jobs/", onFinished=self._onGetPrintJobsFinished)
+
+    def _onGetPrintJobsFinished(self, reply: QNetworkReply):
+        status_code = reply.attribute(QNetworkRequest.HttpStatusCodeAttribute)
+        if status_code == 200:
+            try:
+                result = json.loads(bytes(reply.readAll()).decode("utf-8"))
+            except json.decoder.JSONDecodeError:
+                Logger.log("w", "Received an invalid print jobs message: Not valid JSON.")
+                return
+            print_jobs_seen = []
+            for print_job_data in result:
+                print_job = None
+                for job in self._print_jobs:
+                    if job.key == print_job_data["uuid"]:
+                        print_job = job
+                        break
+
+                if print_job is None:
+                    print_job = PrintJobOutputModel(output_controller = None,
+                                                    key = print_job_data["uuid"],
+                                                    name = print_job_data["name"])
+                print_job.updateTimeTotal(print_job_data["time_total"])
+                print_job.updateTimeElapsed(print_job_data["time_elapsed"])
+                print_job.updateState(print_job_data["status"])
+                if print_job.state == "printing":
+                    # Print job should be assigned to a printer.
+                    printer = self._getPrinterByKey(print_job_data["printer_uuid"])
+                    if printer:
+                        printer.updateActivePrintJob(print_job)
+
+                print_jobs_seen.append(print_job)
+            for old_job in self._print_jobs:
+                if old_job not in print_jobs_seen:
+                    # Print job needs to be removed.
+                    old_job.assignedPrinter.updateActivePrintJob(None)
+
+            self._print_jobs = print_jobs_seen
 
-    def _onGetPrintersDataFinished(self, reply):
+    def _onGetPrintersDataFinished(self, reply: QNetworkReply):
         status_code = reply.attribute(QNetworkRequest.HttpStatusCodeAttribute)
         if status_code == 200:
             try:
                 result = json.loads(bytes(reply.readAll()).decode("utf-8"))
             except json.decoder.JSONDecodeError:
-                Logger.log("w", "Received an invalid printer state message: Not valid JSON.")
+                Logger.log("w", "Received an invalid printers state message: Not valid JSON.")
                 return
 
             for printer_data in result: