Added data handling for legacy printer

CL-541
This commit is contained in:
Jaime van Kessel 2017-11-20 16:03:54 +01:00
parent 61753540e4
commit 1167fa0a89
4 changed files with 104 additions and 7 deletions

View file

@ -1,4 +1,6 @@
from UM.Application import Application from UM.Application import Application
from UM.Logger import Logger
from cura.PrinterOutputDevice import PrinterOutputDevice from cura.PrinterOutputDevice import PrinterOutputDevice
from PyQt5.QtNetwork import QHttpMultiPart, QHttpPart, QNetworkRequest, QNetworkAccessManager, QNetworkReply from PyQt5.QtNetwork import QHttpMultiPart, QHttpPart, QNetworkRequest, QNetworkAccessManager, QNetworkReply
@ -30,6 +32,7 @@ class NetworkedPrinterOutputDevice(PrinterOutputDevice):
def _createEmptyRequest(self, target): def _createEmptyRequest(self, target):
url = QUrl("http://" + self._address + self._api_prefix + target) url = QUrl("http://" + self._address + self._api_prefix + target)
print(url)
request = QNetworkRequest(url) request = QNetworkRequest(url)
request.setHeader(QNetworkRequest.ContentTypeHeader, "application/json") request.setHeader(QNetworkRequest.ContentTypeHeader, "application/json")
request.setHeader(QNetworkRequest.UserAgentHeader, self._user_agent) request.setHeader(QNetworkRequest.UserAgentHeader, self._user_agent)
@ -66,9 +69,8 @@ class NetworkedPrinterOutputDevice(PrinterOutputDevice):
self._last_response_time = time() self._last_response_time = time()
try: try:
self._onFinishedCallbacks[reply.url().toString() + str(reply.operation())](reply) self._onFinishedCallbacks[reply.url().toString() + str(reply.operation())](reply)
except Exception as e: except Exception:
print("Something went wrong with callback", e) Logger.logException("w", "something went wrong with callback")
pass
@pyqtSlot(str, result=str) @pyqtSlot(str, result=str)
def getProperty(self, key): def getProperty(self, key):

View file

@ -11,6 +11,7 @@ class PrintJobOutputModel(QObject):
stateChanged = pyqtSignal() stateChanged = pyqtSignal()
timeTotalChanged = pyqtSignal() timeTotalChanged = pyqtSignal()
timeElapsedChanged = pyqtSignal() timeElapsedChanged = pyqtSignal()
nameChanged = pyqtSignal()
def __init__(self, output_controller: "PrinterOutputController", parent=None): def __init__(self, output_controller: "PrinterOutputController", parent=None):
super().__init__(parent) super().__init__(parent)
@ -18,6 +19,16 @@ class PrintJobOutputModel(QObject):
self._state = "" self._state = ""
self._time_total = 0 self._time_total = 0
self._time_elapsed = 0 self._time_elapsed = 0
self._name = ""
@pyqtProperty(str, notify = nameChanged)
def name(self):
return self._name
def updateName(self, name: str):
if self._name != name:
self._name = name
self.nameChanged.emit()
@pyqtProperty(int, notify = timeTotalChanged) @pyqtProperty(int, notify = timeTotalChanged)
def timeTotal(self): def timeTotal(self):

View file

@ -5,11 +5,11 @@ from PyQt5.QtCore import pyqtSignal, pyqtProperty, QObject, QVariant, pyqtSlot
from UM.Logger import Logger from UM.Logger import Logger
from typing import Optional, List from typing import Optional, List
from UM.Math.Vector import Vector from UM.Math.Vector import Vector
from cura.PrinterOutput.ExtruderOuputModel import ExtruderOutputModel
MYPY = False MYPY = False
if MYPY: if MYPY:
from cura.PrinterOutput.PrintJobOutputModel import PrintJobOutputModel from cura.PrinterOutput.PrintJobOutputModel import PrintJobOutputModel
from cura.PrinterOutput.ExtruderOuputModel import ExtruderOutputModel
from cura.PrinterOutput.PrinterOutputController import PrinterOutputController from cura.PrinterOutput.PrinterOutputController import PrinterOutputController
@ -21,17 +21,19 @@ class PrinterOutputModel(QObject):
nameChanged = pyqtSignal() nameChanged = pyqtSignal()
headPositionChanged = pyqtSignal() headPositionChanged = pyqtSignal()
def __init__(self, output_controller: "PrinterOutputController", extruders: List["ExtruderOutputModel"], parent=None): def __init__(self, output_controller: "PrinterOutputController", number_of_extruders: int = 1, parent=None):
super().__init__(parent) super().__init__(parent)
self._bed_temperature = 0 self._bed_temperature = 0
self._target_bed_temperature = 0 self._target_bed_temperature = 0
self._name = "" self._name = ""
self._controller = output_controller self._controller = output_controller
self._extruders = extruders self._extruders = [ExtruderOutputModel(printer=self)] * number_of_extruders
self._head_position = Vector(0, 0, 0) self._head_position = Vector(0, 0, 0)
self._active_print_job = None # type: Optional[PrintJobOutputModel] self._active_print_job = None # type: Optional[PrintJobOutputModel]
self._printer_state = "unknown"
# Features of the printer; # Features of the printer;
self._can_pause = True self._can_pause = True
self._can_abort = True self._can_abort = True
@ -135,6 +137,11 @@ class PrinterOutputModel(QObject):
self._active_print_job = print_job self._active_print_job = print_job
self.activePrintJobChanged.emit() self.activePrintJobChanged.emit()
def updatePrinterState(self, printer_state):
if self._printer_state != printer_state:
self._printer_state = printer_state
self.printerStateChanged.emit()
@pyqtProperty(QObject, notify = activePrintJobChanged) @pyqtProperty(QObject, notify = activePrintJobChanged)
def activePrintJob(self): def activePrintJob(self):
return self._active_print_job return self._active_print_job

View file

@ -1,9 +1,86 @@
from cura.PrinterOutput.NetworkedPrinterOutputDevice import NetworkedPrinterOutputDevice from cura.PrinterOutput.NetworkedPrinterOutputDevice import NetworkedPrinterOutputDevice
from cura.PrinterOutput.PrinterOutputModel import PrinterOutputModel
from cura.PrinterOutput.PrintJobOutputModel import PrintJobOutputModel
from UM.Logger import Logger
from PyQt5.QtNetwork import QNetworkRequest
import json
class LegacyUM3OutputDevice(NetworkedPrinterOutputDevice): class LegacyUM3OutputDevice(NetworkedPrinterOutputDevice):
def __init__(self, device_id, address: str, properties, parent = None): def __init__(self, device_id, address: str, properties, parent = None):
super().__init__(device_id = device_id, address = address, properties = properties, parent = parent) super().__init__(device_id = device_id, address = address, properties = properties, parent = parent)
self._api_prefix = "/api/v1/"
self._number_of_extruders = 2
def _update(self): def _update(self):
super()._update() super()._update()
self._get("printer", onFinished=self._onGetPrinterDataFinished)
self._get("print_job", onFinished=self._onGetPrintJobFinished)
def _onGetPrintJobFinished(self, reply):
status_code = reply.attribute(QNetworkRequest.HttpStatusCodeAttribute)
if not self._printers:
return # Ignore the data for now, we don't have info about a printer yet.
printer = self._printers[0]
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 job state message: Not valid JSON.")
return
if printer.activePrintJob is None:
print_job = PrintJobOutputModel(output_controller=None)
printer.updateActivePrintJob(print_job)
else:
print_job = printer.activePrintJob
print_job.updateState(result["state"])
print_job.updateTimeElapsed(result["time_elapsed"])
print_job.updateTimeTotal(result["time_total"])
print_job.updateName(result["name"])
elif status_code == 404:
# No job found, so delete the active print job (if any!)
printer.updateActivePrintJob(None)
else:
Logger.log("w",
"Got status code {status_code} while trying to get printer data".format(status_code=status_code))
def _onGetPrinterDataFinished(self, reply):
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.")
return
if not self._printers:
self._printers = [PrinterOutputModel(output_controller=None, number_of_extruders=self._number_of_extruders)]
# LegacyUM3 always has a single printer.
printer = self._printers[0]
printer.updateBedTemperature(result["bed"]["temperature"]["current"])
printer.updateTargetBedTemperature(result["bed"]["temperature"]["target"])
printer.updatePrinterState(result["status"])
for index in range(0, self._number_of_extruders):
temperatures = result["heads"][0]["extruders"][index]["hotend"]["temperature"]
printer.extruders[index].updateTargetHotendTemperature(temperatures["target"])
printer.extruders[index].updateHotendTemperature(temperatures["current"])
# TODO: Set active material
try:
hotend_id = result["heads"][0]["extruders"][index]["hotend"]["id"]
except KeyError:
hotend_id = ""
printer.extruders[index].updateHotendID(hotend_id)
else:
Logger.log("w",
"Got status code {status_code} while trying to get printer data".format(status_code = status_code))