diff options
author | fieldOfView <aldo@fieldofview.com> | 2018-10-03 21:55:51 +0300 |
---|---|---|
committer | fieldOfView <aldo@fieldofview.com> | 2018-10-03 21:55:51 +0300 |
commit | b7542a8ef8ff17491c1366e7ca5532ebc9e0c526 (patch) | |
tree | a4c30ce9d3ff274928f3ad675ca5e6fdf799edda /plugins/FirmwareUpdater | |
parent | 61ffdf23d70d79857156020dcd1508496d036511 (diff) |
Move Firmware Updater into a plugin of its own
Diffstat (limited to 'plugins/FirmwareUpdater')
-rw-r--r-- | plugins/FirmwareUpdater/FirmwareUpdaterMachineAction.py | 68 | ||||
-rw-r--r-- | plugins/FirmwareUpdater/FirmwareUpdaterMachineAction.qml | 191 | ||||
-rw-r--r-- | plugins/FirmwareUpdater/__init__.py | 13 | ||||
-rw-r--r-- | plugins/FirmwareUpdater/plugin.json | 8 |
4 files changed, 280 insertions, 0 deletions
diff --git a/plugins/FirmwareUpdater/FirmwareUpdaterMachineAction.py b/plugins/FirmwareUpdater/FirmwareUpdaterMachineAction.py new file mode 100644 index 0000000000..4faa3abc64 --- /dev/null +++ b/plugins/FirmwareUpdater/FirmwareUpdaterMachineAction.py @@ -0,0 +1,68 @@ +# Copyright (c) 2018 Ultimaker B.V. +# Cura is released under the terms of the LGPLv3 or higher. + +from cura.CuraApplication import CuraApplication +from UM.Settings.DefinitionContainer import DefinitionContainer +from cura.MachineAction import MachineAction +from UM.i18n import i18nCatalog +from UM.Settings.ContainerRegistry import ContainerRegistry +from cura.PrinterOutput.FirmwareUpdater import FirmwareUpdateState + +from PyQt5.QtCore import pyqtSignal, pyqtProperty, QObject +from typing import Optional + +MYPY = False +if MYPY: + from cura.PrinterOutput.FirmwareUpdater import FirmwareUpdater + from cura.PrinterOutput.PrinterOutputDevice import PrinterOutputDevice + +catalog = i18nCatalog("cura") + +## Upgrade the firmware of a machine by USB with this action. +class FirmwareUpdaterMachineAction(MachineAction): + def __init__(self) -> None: + super().__init__("UpgradeFirmware", catalog.i18nc("@action", "Upgrade Firmware")) + self._qml_url = "FirmwareUpdaterMachineAction.qml" + ContainerRegistry.getInstance().containerAdded.connect(self._onContainerAdded) + + self._active_output_device = None #type: Optional[PrinterOutputDevice] + self._active_firmware_updater = None #type: Optional[FirmwareUpdater] + + CuraApplication.getInstance().engineCreatedSignal.connect(self._onEngineCreated) + + def _onEngineCreated(self) -> None: + CuraApplication.getInstance().getMachineManager().outputDevicesChanged.connect(self._onOutputDevicesChanged) + + def _onContainerAdded(self, container) -> None: + # Add this action as a supported action to all machine definitions if they support USB connection + if isinstance(container, DefinitionContainer) and container.getMetaDataEntry("type") == "machine" and container.getMetaDataEntry("supports_usb_connection"): + CuraApplication.getInstance().getMachineActionManager().addSupportedAction(container.getId(), self.getKey()) + + def _onOutputDevicesChanged(self) -> None: + if self._active_output_device: + self._active_output_device.activePrinter.getController().canUpdateFirmwareChanged.disconnect(self._onControllerCanUpdateFirmwareChanged) + + output_devices = CuraApplication.getInstance().getMachineManager().printerOutputDevices + self._active_output_device = output_devices[0] if output_devices else None + + if self._active_output_device: + self._active_output_device.activePrinter.getController().canUpdateFirmwareChanged.connect(self._onControllerCanUpdateFirmwareChanged) + + self.outputDeviceCanUpdateFirmwareChanged.emit() + + def _onControllerCanUpdateFirmwareChanged(self) -> None: + self.outputDeviceCanUpdateFirmwareChanged.emit() + + outputDeviceCanUpdateFirmwareChanged = pyqtSignal() + @pyqtProperty(QObject, notify = outputDeviceCanUpdateFirmwareChanged) + def firmwareUpdater(self) -> Optional["FirmwareUpdater"]: + if self._active_output_device and self._active_output_device.activePrinter.getController().can_update_firmware: + self._active_firmware_updater = self._active_output_device.getFirmwareUpdater() + return self._active_firmware_updater + + elif self._active_firmware_updater and self._active_firmware_updater.firmwareUpdateState not in [FirmwareUpdateState.idle, FirmwareUpdateState.completed]: + # During a firmware update, the PrinterOutputDevice is disconnected but the FirmwareUpdater is still there + return self._active_firmware_updater + + self._active_firmware_updater = None + return None diff --git a/plugins/FirmwareUpdater/FirmwareUpdaterMachineAction.qml b/plugins/FirmwareUpdater/FirmwareUpdaterMachineAction.qml new file mode 100644 index 0000000000..ab5bb89347 --- /dev/null +++ b/plugins/FirmwareUpdater/FirmwareUpdaterMachineAction.qml @@ -0,0 +1,191 @@ +// Copyright (c) 2018 Ultimaker B.V. +// Cura is released under the terms of the LGPLv3 or higher. + +import QtQuick 2.2 +import QtQuick.Controls 1.1 +import QtQuick.Layouts 1.1 +import QtQuick.Window 2.1 +import QtQuick.Dialogs 1.2 // For filedialog + +import UM 1.2 as UM +import Cura 1.0 as Cura + + +Cura.MachineAction +{ + anchors.fill: parent; + property bool printerConnected: Cura.MachineManager.printerConnected + property var activeOutputDevice: printerConnected ? Cura.MachineManager.printerOutputDevices[0] : null + property var canUpdateFirmware: activeOutputDevice ? activeOutputDevice.activePrinter.canUpdateFirmware : false + + Column + { + id: firmwareUpdaterMachineAction + anchors.fill: parent; + UM.I18nCatalog { id: catalog; name:"cura"} + spacing: UM.Theme.getSize("default_margin").height + + Label + { + width: parent.width + text: catalog.i18nc("@title", "Update Firmware") + wrapMode: Text.WordWrap + font.pointSize: 18 + } + Label + { + width: parent.width + wrapMode: Text.WordWrap + text: catalog.i18nc("@label", "Firmware is the piece of software running directly on your 3D printer. This firmware controls the step motors, regulates the temperature and ultimately makes your printer work.") + } + + Label + { + width: parent.width + wrapMode: Text.WordWrap + text: catalog.i18nc("@label", "The firmware shipping with new printers works, but new versions tend to have more features and improvements."); + } + + Row + { + anchors.horizontalCenter: parent.horizontalCenter + width: childrenRect.width + spacing: UM.Theme.getSize("default_margin").width + property var firmwareName: Cura.MachineManager.activeMachine.getDefaultFirmwareName() + Button + { + id: autoUpgradeButton + text: catalog.i18nc("@action:button", "Automatically upgrade Firmware"); + enabled: parent.firmwareName != "" && canUpdateFirmware + onClicked: + { + updateProgressDialog.visible = true; + activeOutputDevice.updateFirmware(parent.firmwareName); + } + } + Button + { + id: manualUpgradeButton + text: catalog.i18nc("@action:button", "Upload custom Firmware"); + enabled: canUpdateFirmware + onClicked: + { + customFirmwareDialog.open() + } + } + } + + Label + { + width: parent.width + wrapMode: Text.WordWrap + visible: !printerConnected && !updateProgressDialog.visible + text: catalog.i18nc("@label", "Firmware can not be updated because there is no connection with the printer."); + } + + Label + { + width: parent.width + wrapMode: Text.WordWrap + visible: printerConnected && !canUpdateFirmware + text: catalog.i18nc("@label", "Firmware can not be updated because the connection with the printer does not support upgrading firmware."); + } + } + + FileDialog + { + id: customFirmwareDialog + title: catalog.i18nc("@title:window", "Select custom firmware") + nameFilters: "Firmware image files (*.hex)" + selectExisting: true + onAccepted: + { + updateProgressDialog.visible = true; + activeOutputDevice.updateFirmware(fileUrl); + } + } + + UM.Dialog + { + id: updateProgressDialog + + width: minimumWidth + minimumWidth: 500 * screenScaleFactor + height: minimumHeight + minimumHeight: 100 * screenScaleFactor + + modality: Qt.ApplicationModal + + title: catalog.i18nc("@title:window","Firmware Update") + + Column + { + anchors.fill: parent + + Label + { + anchors + { + left: parent.left + right: parent.right + } + + text: { + if(manager.firmwareUpdater == null) + { + return ""; + } + switch (manager.firmwareUpdater.firmwareUpdateState) + { + case 0: + return ""; //Not doing anything (eg; idling) + case 1: + return catalog.i18nc("@label","Updating firmware."); + case 2: + return catalog.i18nc("@label","Firmware update completed."); + case 3: + return catalog.i18nc("@label","Firmware update failed due to an unknown error."); + case 4: + return catalog.i18nc("@label","Firmware update failed due to an communication error."); + case 5: + return catalog.i18nc("@label","Firmware update failed due to an input/output error."); + case 6: + return catalog.i18nc("@label","Firmware update failed due to missing firmware."); + } + } + + wrapMode: Text.Wrap + } + + ProgressBar + { + id: prog + value: (manager.firmwareUpdater != null) ? manager.firmwareUpdater.firmwareProgress : 0 + minimumValue: 0 + maximumValue: 100 + indeterminate: + { + if(manager.firmwareUpdater == null) + { + return false; + } + return manager.firmwareUpdater.firmwareProgress < 1 && manager.firmwareUpdater.firmwareProgress > 0; + } + anchors + { + left: parent.left; + right: parent.right; + } + } + } + + rightButtons: [ + Button + { + text: catalog.i18nc("@action:button","Close"); + enabled: (manager.firmwareUpdater != null) ? manager.firmwareUpdater.firmwareUpdateState != 1 : true; + onClicked: updateProgressDialog.visible = false; + } + ] + } +}
\ No newline at end of file diff --git a/plugins/FirmwareUpdater/__init__.py b/plugins/FirmwareUpdater/__init__.py new file mode 100644 index 0000000000..58c351a4ea --- /dev/null +++ b/plugins/FirmwareUpdater/__init__.py @@ -0,0 +1,13 @@ +# Copyright (c) 2018 Ultimaker B.V. +# Cura is released under the terms of the LGPLv3 or higher. + +from . import FirmwareUpdaterMachineAction + +def getMetaData(): + return { + } + +def register(app): + return { "machine_action": [ + FirmwareUpdaterMachineAction.FirmwareUpdaterMachineAction(), + ]} diff --git a/plugins/FirmwareUpdater/plugin.json b/plugins/FirmwareUpdater/plugin.json new file mode 100644 index 0000000000..3e09eab2b5 --- /dev/null +++ b/plugins/FirmwareUpdater/plugin.json @@ -0,0 +1,8 @@ +{ + "name": "Firmware Updater", + "author": "Ultimaker B.V.", + "version": "1.0.0", + "description": "Provides a machine actions for updating firmware.", + "api": 5, + "i18n-catalog": "cura" +} |