Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/Ultimaker/Cura.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorfieldOfView <aldo@fieldofview.com>2018-10-03 21:55:51 +0300
committerfieldOfView <aldo@fieldofview.com>2018-10-03 21:55:51 +0300
commitb7542a8ef8ff17491c1366e7ca5532ebc9e0c526 (patch)
treea4c30ce9d3ff274928f3ad675ca5e6fdf799edda /plugins/FirmwareUpdater
parent61ffdf23d70d79857156020dcd1508496d036511 (diff)
Move Firmware Updater into a plugin of its own
Diffstat (limited to 'plugins/FirmwareUpdater')
-rw-r--r--plugins/FirmwareUpdater/FirmwareUpdaterMachineAction.py68
-rw-r--r--plugins/FirmwareUpdater/FirmwareUpdaterMachineAction.qml191
-rw-r--r--plugins/FirmwareUpdater/__init__.py13
-rw-r--r--plugins/FirmwareUpdater/plugin.json8
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"
+}