Add typing and appease MYPY

This commit is contained in:
fieldOfView 2018-09-28 12:40:44 +02:00
parent a12c0e8d9e
commit a573a598b0
6 changed files with 83 additions and 76 deletions

View file

@ -5,9 +5,11 @@ from PyQt5.QtCore import QObject, QUrl, pyqtSignal, pyqtProperty
from UM.Resources import Resources from UM.Resources import Resources
from cura.PrinterOutputDevice import PrinterOutputDevice from cura.PrinterOutputDevice import PrinterOutputDevice
from cura.CuraApplication import CuraApplication
from enum import IntEnum from enum import IntEnum
from threading import Thread from threading import Thread
from typing import Any
class FirmwareUpdater(QObject): class FirmwareUpdater(QObject):
firmwareProgressChanged = pyqtSignal() firmwareProgressChanged = pyqtSignal()
@ -19,11 +21,11 @@ class FirmwareUpdater(QObject):
self._update_firmware_thread = Thread(target=self._updateFirmware, daemon=True) self._update_firmware_thread = Thread(target=self._updateFirmware, daemon=True)
self._firmware_view = None self._firmware_view = None
self._firmware_location = None self._firmware_location = ""
self._firmware_progress = 0 self._firmware_progress = 0
self._firmware_update_state = FirmwareUpdateState.idle self._firmware_update_state = FirmwareUpdateState.idle
def updateFirmware(self, file): def updateFirmware(self, file: Any[str, QUrl]) -> None:
# the file path could be url-encoded. # the file path could be url-encoded.
if file.startswith("file://"): if file.startswith("file://"):
self._firmware_location = QUrl(file).toLocalFile() self._firmware_location = QUrl(file).toLocalFile()
@ -33,10 +35,10 @@ class FirmwareUpdater(QObject):
self.setFirmwareUpdateState(FirmwareUpdateState.updating) self.setFirmwareUpdateState(FirmwareUpdateState.updating)
self._update_firmware_thread.start() self._update_firmware_thread.start()
def _updateFirmware(self): def _updateFirmware(self) -> None:
raise NotImplementedError("_updateFirmware needs to be implemented") raise NotImplementedError("_updateFirmware needs to be implemented")
def cleanupAfterUpdate(self): def cleanupAfterUpdate(self) -> None:
# Clean up for next attempt. # Clean up for next attempt.
self._update_firmware_thread = Thread(target=self._updateFirmware, daemon=True) self._update_firmware_thread = Thread(target=self._updateFirmware, daemon=True)
self._firmware_location = "" self._firmware_location = ""
@ -45,28 +47,29 @@ class FirmwareUpdater(QObject):
## Show firmware interface. ## Show firmware interface.
# This will create the view if its not already created. # This will create the view if its not already created.
def showFirmwareInterface(self): def showFirmwareInterface(self) -> None:
if self._firmware_view is None: if self._firmware_view is None:
path = Resources.getPath(self.ResourceTypes.QmlFiles, "FirmwareUpdateWindow.qml") path = Resources.getPath(self.ResourceTypes.QmlFiles, "FirmwareUpdateWindow.qml")
self._firmware_view = CuraApplication.getInstance().createQmlComponent(path, {"manager": self}) self._firmware_view = CuraApplication.getInstance().createQmlComponent(path, {"manager": self})
if self._firmware_view:
self._firmware_view.show() self._firmware_view.show()
@pyqtProperty(float, notify = firmwareProgressChanged) @pyqtProperty(float, notify = firmwareProgressChanged)
def firmwareProgress(self): def firmwareProgress(self) -> float:
return self._firmware_progress return self._firmware_progress
@pyqtProperty(int, notify=firmwareUpdateStateChanged) @pyqtProperty(int, notify=firmwareUpdateStateChanged)
def firmwareUpdateState(self): def firmwareUpdateState(self) -> FirmwareUpdateState:
return self._firmware_update_state return self._firmware_update_state
def setFirmwareUpdateState(self, state): def setFirmwareUpdateState(self, state) -> None:
if self._firmware_update_state != state: if self._firmware_update_state != state:
self._firmware_update_state = state self._firmware_update_state = state
self.firmwareUpdateStateChanged.emit() self.firmwareUpdateStateChanged.emit()
# Callback function for firmware update progress. # Callback function for firmware update progress.
def _onFirmwareProgress(self, progress, max_progress = 100): def _onFirmwareProgress(self, progress, max_progress = 100) -> None:
self._firmware_progress = (progress / max_progress) * 100 # Convert to scale of 0-100 self._firmware_progress = (progress / max_progress) * 100 # Convert to scale of 0-100
self.firmwareProgressChanged.emit() self.firmwareProgressChanged.emit()

View file

@ -91,7 +91,7 @@ class PrintJobOutputModel(QObject):
def assignedPrinter(self): def assignedPrinter(self):
return self._assigned_printer return self._assigned_printer
def updateAssignedPrinter(self, assigned_printer: "PrinterOutputModel"): def updateAssignedPrinter(self, assigned_printer: Optional[PrinterOutputModel]):
if self._assigned_printer != assigned_printer: if self._assigned_printer != assigned_printer:
old_printer = self._assigned_printer old_printer = self._assigned_printer
self._assigned_printer = assigned_printer self._assigned_printer = assigned_printer

View file

@ -4,15 +4,18 @@
from UM.Logger import Logger from UM.Logger import Logger
from UM.Signal import Signal from UM.Signal import Signal
from typing import Any
MYPY = False MYPY = False
if MYPY: if MYPY:
from cura.PrinterOutput.PrintJobOutputModel import PrintJobOutputModel from cura.PrinterOutput.PrintJobOutputModel import PrintJobOutputModel
from cura.PrinterOutput.ExtruderOutputModel import ExtruderOutputModel from cura.PrinterOutput.ExtruderOutputModel import ExtruderOutputModel
from cura.PrinterOutput.PrinterOutputModel import PrinterOutputModel from cura.PrinterOutput.PrinterOutputModel import PrinterOutputModel
from cura.PrinterOutput.PrinterOutputDevice import PrinterOutputDevice
class PrinterOutputController: class PrinterOutputController:
def __init__(self, output_device): def __init__(self, output_device: PrinterOutputDevice) -> None:
self.can_pause = True self.can_pause = True
self.can_abort = True self.can_abort = True
self.can_pre_heat_bed = True self.can_pre_heat_bed = True
@ -22,44 +25,44 @@ class PrinterOutputController:
self.can_update_firmware = False self.can_update_firmware = False
self._output_device = output_device self._output_device = output_device
def setTargetHotendTemperature(self, printer: "PrinterOutputModel", extruder: "ExtruderOutputModel", temperature: int): def setTargetHotendTemperature(self, printer: "PrinterOutputModel", extruder: "ExtruderOutputModel", temperature: Any[int, float]) -> None:
Logger.log("w", "Set target hotend temperature not implemented in controller") Logger.log("w", "Set target hotend temperature not implemented in controller")
def setTargetBedTemperature(self, printer: "PrinterOutputModel", temperature: int): def setTargetBedTemperature(self, printer: "PrinterOutputModel", temperature: int) -> None:
Logger.log("w", "Set target bed temperature not implemented in controller") Logger.log("w", "Set target bed temperature not implemented in controller")
def setJobState(self, job: "PrintJobOutputModel", state: str): def setJobState(self, job: "PrintJobOutputModel", state: str) -> None:
Logger.log("w", "Set job state not implemented in controller") Logger.log("w", "Set job state not implemented in controller")
def cancelPreheatBed(self, printer: "PrinterOutputModel"): def cancelPreheatBed(self, printer: "PrinterOutputModel") -> None:
Logger.log("w", "Cancel preheat bed not implemented in controller") Logger.log("w", "Cancel preheat bed not implemented in controller")
def preheatBed(self, printer: "PrinterOutputModel", temperature, duration): def preheatBed(self, printer: "PrinterOutputModel", temperature, duration) -> None:
Logger.log("w", "Preheat bed not implemented in controller") Logger.log("w", "Preheat bed not implemented in controller")
def cancelPreheatHotend(self, extruder: "ExtruderOutputModel"): def cancelPreheatHotend(self, extruder: "ExtruderOutputModel") -> None:
Logger.log("w", "Cancel preheat hotend not implemented in controller") Logger.log("w", "Cancel preheat hotend not implemented in controller")
def preheatHotend(self, extruder: "ExtruderOutputModel", temperature, duration): def preheatHotend(self, extruder: "ExtruderOutputModel", temperature, duration) -> None:
Logger.log("w", "Preheat hotend not implemented in controller") Logger.log("w", "Preheat hotend not implemented in controller")
def setHeadPosition(self, printer: "PrinterOutputModel", x, y, z, speed): def setHeadPosition(self, printer: "PrinterOutputModel", x, y, z, speed) -> None:
Logger.log("w", "Set head position not implemented in controller") Logger.log("w", "Set head position not implemented in controller")
def moveHead(self, printer: "PrinterOutputModel", x, y, z, speed): def moveHead(self, printer: "PrinterOutputModel", x, y, z, speed) -> None:
Logger.log("w", "Move head not implemented in controller") Logger.log("w", "Move head not implemented in controller")
def homeBed(self, printer: "PrinterOutputModel"): def homeBed(self, printer: "PrinterOutputModel") -> None:
Logger.log("w", "Home bed not implemented in controller") Logger.log("w", "Home bed not implemented in controller")
def homeHead(self, printer: "PrinterOutputModel"): def homeHead(self, printer: "PrinterOutputModel") -> None:
Logger.log("w", "Home head not implemented in controller") Logger.log("w", "Home head not implemented in controller")
def sendRawCommand(self, printer: "PrinterOutputModel", command: str): def sendRawCommand(self, printer: "PrinterOutputModel", command: str) -> None:
Logger.log("w", "Custom command not implemented in controller") Logger.log("w", "Custom command not implemented in controller")
canUpdateFirmwareChanged = Signal() canUpdateFirmwareChanged = Signal()
def setCanUpdateFirmware(self, can_update_firmware: bool): def setCanUpdateFirmware(self, can_update_firmware: bool) -> None:
if can_update_firmware != self.can_update_firmware: if can_update_firmware != self.can_update_firmware:
self.can_update_firmware = can_update_firmware self.can_update_firmware = can_update_firmware
self.canUpdateFirmwareChanged.emit() self.canUpdateFirmwareChanged.emit()

View file

@ -2,7 +2,7 @@
# Cura is released under the terms of the LGPLv3 or higher. # Cura is released under the terms of the LGPLv3 or higher.
from PyQt5.QtCore import pyqtSignal, pyqtProperty, QObject, QVariant, pyqtSlot from PyQt5.QtCore import pyqtSignal, pyqtProperty, QObject, QVariant, pyqtSlot
from typing import Optional from typing import List, Dict, Optional
from UM.Math.Vector import Vector from UM.Math.Vector import Vector
from cura.PrinterOutput.ConfigurationModel import ConfigurationModel from cura.PrinterOutput.ConfigurationModel import ConfigurationModel
from cura.PrinterOutput.ExtruderOutputModel import ExtruderOutputModel from cura.PrinterOutput.ExtruderOutputModel import ExtruderOutputModel
@ -11,6 +11,7 @@ MYPY = False
if MYPY: if MYPY:
from cura.PrinterOutput.PrintJobOutputModel import PrintJobOutputModel from cura.PrinterOutput.PrintJobOutputModel import PrintJobOutputModel
from cura.PrinterOutput.PrinterOutputController import PrinterOutputController from cura.PrinterOutput.PrinterOutputController import PrinterOutputController
from cura.PrinterOutput.NetworkCamera import NetworkCamera
class PrinterOutputModel(QObject): class PrinterOutputModel(QObject):
@ -44,7 +45,7 @@ class PrinterOutputModel(QObject):
self._printer_state = "unknown" self._printer_state = "unknown"
self._is_preheating = False self._is_preheating = False
self._printer_type = "" self._printer_type = ""
self._buildplate_name = None self._buildplate_name = ""
self._printer_configuration.extruderConfigurations = [extruder.extruderConfiguration for extruder in self._printer_configuration.extruderConfigurations = [extruder.extruderConfiguration for extruder in
self._extruders] self._extruders]
@ -52,32 +53,32 @@ class PrinterOutputModel(QObject):
self._camera = None self._camera = None
@pyqtProperty(str, constant = True) @pyqtProperty(str, constant = True)
def firmwareVersion(self): def firmwareVersion(self) -> str:
return self._firmware_version return self._firmware_version
def setCamera(self, camera): def setCamera(self, camera: Optional["NetworkCamera"]) -> None:
if self._camera is not camera: if self._camera is not camera:
self._camera = camera self._camera = camera
self.cameraChanged.emit() self.cameraChanged.emit()
def updateIsPreheating(self, pre_heating): def updateIsPreheating(self, pre_heating: bool) -> None:
if self._is_preheating != pre_heating: if self._is_preheating != pre_heating:
self._is_preheating = pre_heating self._is_preheating = pre_heating
self.isPreheatingChanged.emit() self.isPreheatingChanged.emit()
@pyqtProperty(bool, notify=isPreheatingChanged) @pyqtProperty(bool, notify=isPreheatingChanged)
def isPreheating(self): def isPreheating(self) -> bool:
return self._is_preheating return self._is_preheating
@pyqtProperty(QObject, notify=cameraChanged) @pyqtProperty(QObject, notify=cameraChanged)
def camera(self): def camera(self) -> Optional["NetworkCamera"]:
return self._camera return self._camera
@pyqtProperty(str, notify = printerTypeChanged) @pyqtProperty(str, notify = printerTypeChanged)
def type(self): def type(self) -> str:
return self._printer_type return self._printer_type
def updateType(self, printer_type): def updateType(self, printer_type: str) -> None:
if self._printer_type != printer_type: if self._printer_type != printer_type:
self._printer_type = printer_type self._printer_type = printer_type
self._printer_configuration.printerType = self._printer_type self._printer_configuration.printerType = self._printer_type
@ -85,10 +86,10 @@ class PrinterOutputModel(QObject):
self.configurationChanged.emit() self.configurationChanged.emit()
@pyqtProperty(str, notify = buildplateChanged) @pyqtProperty(str, notify = buildplateChanged)
def buildplate(self): def buildplate(self) -> str:
return self._buildplate_name return self._buildplate_name
def updateBuildplateName(self, buildplate_name): def updateBuildplateName(self, buildplate_name: str) -> None:
if self._buildplate_name != buildplate_name: if self._buildplate_name != buildplate_name:
self._buildplate_name = buildplate_name self._buildplate_name = buildplate_name
self._printer_configuration.buildplateConfiguration = self._buildplate_name self._printer_configuration.buildplateConfiguration = self._buildplate_name
@ -96,66 +97,66 @@ class PrinterOutputModel(QObject):
self.configurationChanged.emit() self.configurationChanged.emit()
@pyqtProperty(str, notify=keyChanged) @pyqtProperty(str, notify=keyChanged)
def key(self): def key(self) -> str:
return self._key return self._key
def updateKey(self, key: str): def updateKey(self, key: str) -> None:
if self._key != key: if self._key != key:
self._key = key self._key = key
self.keyChanged.emit() self.keyChanged.emit()
@pyqtSlot() @pyqtSlot()
def homeHead(self): def homeHead(self) -> None:
self._controller.homeHead(self) self._controller.homeHead(self)
@pyqtSlot() @pyqtSlot()
def homeBed(self): def homeBed(self) -> None:
self._controller.homeBed(self) self._controller.homeBed(self)
@pyqtSlot(str) @pyqtSlot(str)
def sendRawCommand(self, command: str): def sendRawCommand(self, command: str) -> None:
self._controller.sendRawCommand(self, command) self._controller.sendRawCommand(self, command)
@pyqtProperty("QVariantList", constant = True) @pyqtProperty("QVariantList", constant = True)
def extruders(self): def extruders(self) -> List["ExtruderOutputModel"]:
return self._extruders return self._extruders
@pyqtProperty(QVariant, notify = headPositionChanged) @pyqtProperty(QVariant, notify = headPositionChanged)
def headPosition(self): def headPosition(self) -> Dict[str, float]:
return {"x": self._head_position.x, "y": self._head_position.y, "z": self.head_position.z} return {"x": self._head_position.x, "y": self._head_position.y, "z": self.head_position.z}
def updateHeadPosition(self, x, y, z): def updateHeadPosition(self, x: float, y: float, z: float) -> None:
if self._head_position.x != x or self._head_position.y != y or self._head_position.z != z: if self._head_position.x != x or self._head_position.y != y or self._head_position.z != z:
self._head_position = Vector(x, y, z) self._head_position = Vector(x, y, z)
self.headPositionChanged.emit() self.headPositionChanged.emit()
@pyqtProperty(float, float, float) @pyqtProperty(float, float, float)
@pyqtProperty(float, float, float, float) @pyqtProperty(float, float, float, float)
def setHeadPosition(self, x, y, z, speed = 3000): def setHeadPosition(self, x: float, y: float, z: float, speed: float = 3000) -> None:
self.updateHeadPosition(x, y, z) self.updateHeadPosition(x, y, z)
self._controller.setHeadPosition(self, x, y, z, speed) self._controller.setHeadPosition(self, x, y, z, speed)
@pyqtProperty(float) @pyqtProperty(float)
@pyqtProperty(float, float) @pyqtProperty(float, float)
def setHeadX(self, x, speed = 3000): def setHeadX(self, x: float, speed: float = 3000) -> None:
self.updateHeadPosition(x, self._head_position.y, self._head_position.z) self.updateHeadPosition(x, self._head_position.y, self._head_position.z)
self._controller.setHeadPosition(self, x, self._head_position.y, self._head_position.z, speed) self._controller.setHeadPosition(self, x, self._head_position.y, self._head_position.z, speed)
@pyqtProperty(float) @pyqtProperty(float)
@pyqtProperty(float, float) @pyqtProperty(float, float)
def setHeadY(self, y, speed = 3000): def setHeadY(self, y: float, speed: float = 3000) -> None:
self.updateHeadPosition(self._head_position.x, y, self._head_position.z) self.updateHeadPosition(self._head_position.x, y, self._head_position.z)
self._controller.setHeadPosition(self, self._head_position.x, y, self._head_position.z, speed) self._controller.setHeadPosition(self, self._head_position.x, y, self._head_position.z, speed)
@pyqtProperty(float) @pyqtProperty(float)
@pyqtProperty(float, float) @pyqtProperty(float, float)
def setHeadZ(self, z, speed = 3000): def setHeadZ(self, z: float, speed:float = 3000) -> None:
self.updateHeadPosition(self._head_position.x, self._head_position.y, z) self.updateHeadPosition(self._head_position.x, self._head_position.y, z)
self._controller.setHeadPosition(self, self._head_position.x, self._head_position.y, z, speed) self._controller.setHeadPosition(self, self._head_position.x, self._head_position.y, z, speed)
@pyqtSlot(float, float, float) @pyqtSlot(float, float, float)
@pyqtSlot(float, float, float, float) @pyqtSlot(float, float, float, float)
def moveHead(self, x = 0, y = 0, z = 0, speed = 3000): def moveHead(self, x: float = 0, y: float = 0, z: float = 0, speed: float = 3000) -> None:
self._controller.moveHead(self, x, y, z, speed) self._controller.moveHead(self, x, y, z, speed)
## Pre-heats the heated bed of the printer. ## Pre-heats the heated bed of the printer.
@ -164,47 +165,47 @@ class PrinterOutputModel(QObject):
# Celsius. # Celsius.
# \param duration How long the bed should stay warm, in seconds. # \param duration How long the bed should stay warm, in seconds.
@pyqtSlot(float, float) @pyqtSlot(float, float)
def preheatBed(self, temperature, duration): def preheatBed(self, temperature: float, duration: float) -> None:
self._controller.preheatBed(self, temperature, duration) self._controller.preheatBed(self, temperature, duration)
@pyqtSlot() @pyqtSlot()
def cancelPreheatBed(self): def cancelPreheatBed(self) -> None:
self._controller.cancelPreheatBed(self) self._controller.cancelPreheatBed(self)
def getController(self): def getController(self) -> PrinterOutputController:
return self._controller return self._controller
@pyqtProperty(str, notify=nameChanged) @pyqtProperty(str, notify=nameChanged)
def name(self): def name(self) -> str:
return self._name return self._name
def setName(self, name): def setName(self, name: str) -> None:
self._setName(name) self._setName(name)
self.updateName(name) self.updateName(name)
def updateName(self, name): def updateName(self, name: str) -> None:
if self._name != name: if self._name != name:
self._name = name self._name = name
self.nameChanged.emit() self.nameChanged.emit()
## Update the bed temperature. This only changes it locally. ## Update the bed temperature. This only changes it locally.
def updateBedTemperature(self, temperature): def updateBedTemperature(self, temperature: int) -> None:
if self._bed_temperature != temperature: if self._bed_temperature != temperature:
self._bed_temperature = temperature self._bed_temperature = temperature
self.bedTemperatureChanged.emit() self.bedTemperatureChanged.emit()
def updateTargetBedTemperature(self, temperature): def updateTargetBedTemperature(self, temperature: int) -> None:
if self._target_bed_temperature != temperature: if self._target_bed_temperature != temperature:
self._target_bed_temperature = temperature self._target_bed_temperature = temperature
self.targetBedTemperatureChanged.emit() self.targetBedTemperatureChanged.emit()
## Set the target bed temperature. This ensures that it's actually sent to the remote. ## Set the target bed temperature. This ensures that it's actually sent to the remote.
@pyqtSlot(int) @pyqtSlot(int)
def setTargetBedTemperature(self, temperature): def setTargetBedTemperature(self, temperature: int) -> None:
self._controller.setTargetBedTemperature(self, temperature) self._controller.setTargetBedTemperature(self, temperature)
self.updateTargetBedTemperature(temperature) self.updateTargetBedTemperature(temperature)
def updateActivePrintJob(self, print_job): def updateActivePrintJob(self, print_job: Optional[PrintJobOutputModel]) -> None:
if self._active_print_job != print_job: if self._active_print_job != print_job:
old_print_job = self._active_print_job old_print_job = self._active_print_job
@ -216,83 +217,83 @@ class PrinterOutputModel(QObject):
old_print_job.updateAssignedPrinter(None) old_print_job.updateAssignedPrinter(None)
self.activePrintJobChanged.emit() self.activePrintJobChanged.emit()
def updateState(self, printer_state): def updateState(self, printer_state: str) -> None:
if self._printer_state != printer_state: if self._printer_state != printer_state:
self._printer_state = printer_state self._printer_state = printer_state
self.stateChanged.emit() self.stateChanged.emit()
@pyqtProperty(QObject, notify = activePrintJobChanged) @pyqtProperty(QObject, notify = activePrintJobChanged)
def activePrintJob(self): def activePrintJob(self) -> Optional[PrintJobOutputModel]:
return self._active_print_job return self._active_print_job
@pyqtProperty(str, notify=stateChanged) @pyqtProperty(str, notify=stateChanged)
def state(self): def state(self) -> str:
return self._printer_state return self._printer_state
@pyqtProperty(int, notify = bedTemperatureChanged) @pyqtProperty(int, notify = bedTemperatureChanged)
def bedTemperature(self): def bedTemperature(self) -> int:
return self._bed_temperature return self._bed_temperature
@pyqtProperty(int, notify=targetBedTemperatureChanged) @pyqtProperty(int, notify=targetBedTemperatureChanged)
def targetBedTemperature(self): def targetBedTemperature(self) -> int:
return self._target_bed_temperature return self._target_bed_temperature
# Does the printer support pre-heating the bed at all # Does the printer support pre-heating the bed at all
@pyqtProperty(bool, constant=True) @pyqtProperty(bool, constant=True)
def canPreHeatBed(self): def canPreHeatBed(self) -> bool:
if self._controller: if self._controller:
return self._controller.can_pre_heat_bed return self._controller.can_pre_heat_bed
return False return False
# Does the printer support pre-heating the bed at all # Does the printer support pre-heating the bed at all
@pyqtProperty(bool, constant=True) @pyqtProperty(bool, constant=True)
def canPreHeatHotends(self): def canPreHeatHotends(self) -> bool:
if self._controller: if self._controller:
return self._controller.can_pre_heat_hotends return self._controller.can_pre_heat_hotends
return False return False
# Does the printer support sending raw G-code at all # Does the printer support sending raw G-code at all
@pyqtProperty(bool, constant=True) @pyqtProperty(bool, constant=True)
def canSendRawGcode(self): def canSendRawGcode(self) -> bool:
if self._controller: if self._controller:
return self._controller.can_send_raw_gcode return self._controller.can_send_raw_gcode
return False return False
# Does the printer support pause at all # Does the printer support pause at all
@pyqtProperty(bool, constant=True) @pyqtProperty(bool, constant=True)
def canPause(self): def canPause(self) -> bool:
if self._controller: if self._controller:
return self._controller.can_pause return self._controller.can_pause
return False return False
# Does the printer support abort at all # Does the printer support abort at all
@pyqtProperty(bool, constant=True) @pyqtProperty(bool, constant=True)
def canAbort(self): def canAbort(self) -> bool:
if self._controller: if self._controller:
return self._controller.can_abort return self._controller.can_abort
return False return False
# Does the printer support manual control at all # Does the printer support manual control at all
@pyqtProperty(bool, constant=True) @pyqtProperty(bool, constant=True)
def canControlManually(self): def canControlManually(self) -> bool:
if self._controller: if self._controller:
return self._controller.can_control_manually return self._controller.can_control_manually
return False return False
# Does the printer support upgrading firmware # Does the printer support upgrading firmware
@pyqtProperty(bool, notify = canUpdateFirmwareChanged) @pyqtProperty(bool, notify = canUpdateFirmwareChanged)
def canUpdateFirmware(self): def canUpdateFirmware(self) -> bool:
if self._controller: if self._controller:
return self._controller.can_update_firmware return self._controller.can_update_firmware
return False return False
# Stub to connect UM.Signal to pyqtSignal # Stub to connect UM.Signal to pyqtSignal
def _onControllerCanUpdateFirmwareChanged(self): def _onControllerCanUpdateFirmwareChanged(self) -> None:
self.canUpdateFirmwareChanged.emit() self.canUpdateFirmwareChanged.emit()
# Returns the configuration (material, variant and buildplate) of the current printer # Returns the configuration (material, variant and buildplate) of the current printer
@pyqtProperty(QObject, notify = configurationChanged) @pyqtProperty(QObject, notify = configurationChanged)
def printerConfiguration(self): def printerConfiguration(self) -> Optional[ConfigurationModel]:
if self._printer_configuration.isValid(): if self._printer_configuration.isValid():
return self._printer_configuration return self._printer_configuration
return None return None

View file

@ -10,7 +10,7 @@ class AvrFirmwareUpdater(FirmwareUpdater):
def __init__(self, output_device: PrinterOutputDevice) -> None: def __init__(self, output_device: PrinterOutputDevice) -> None:
super().__init__(output_device) super().__init__(output_device)
def _updateFirmware(self): def _updateFirmware(self) -> None:
try: try:
hex_file = intelHex.readHex(self._firmware_location) hex_file = intelHex.readHex(self._firmware_location)
assert len(hex_file) > 0 assert len(hex_file) > 0

View file

@ -99,12 +99,12 @@ class USBPrinterOutputDevice(PrinterOutputDevice):
application.triggerNextExitCheck() application.triggerNextExitCheck()
@pyqtSlot(str) @pyqtSlot(str)
def updateFirmware(self, file): def updateFirmware(self, file: Any[str, QUrl]) -> None:
self._firmware_updater.updateFirmware(file) self._firmware_updater.updateFirmware(file)
## Reset USB device settings ## Reset USB device settings
# #
def resetDeviceSettings(self): def resetDeviceSettings(self) -> None:
self._firmware_name = None self._firmware_name = None
## Request the current scene to be sent to a USB-connected printer. ## Request the current scene to be sent to a USB-connected printer.