mirror of
https://github.com/Ultimaker/Cura.git
synced 2025-07-07 06:57:28 -06:00
Added data handling for legacy printer
CL-541
This commit is contained in:
parent
61753540e4
commit
1167fa0a89
4 changed files with 104 additions and 7 deletions
|
@ -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):
|
||||||
|
|
|
@ -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):
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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))
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue