From 66f773434fb18ed74281602cab2a9ecc4378f283 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Mon, 5 Sep 2016 15:42:09 +0200 Subject: [PATCH 1/3] UpgradeFirmwareAction now supports custom firmware uploading CURA-955 --- .../USBPrinterOutputDeviceManager.py | 30 +++++++------- .../UpgradeFirmwareMachineAction.qml | 40 ++++++++++++------- 2 files changed, 42 insertions(+), 28 deletions(-) diff --git a/plugins/USBPrinting/USBPrinterOutputDeviceManager.py b/plugins/USBPrinting/USBPrinterOutputDeviceManager.py index 801ce4743f..7d1b3fea3b 100644 --- a/plugins/USBPrinting/USBPrinterOutputDeviceManager.py +++ b/plugins/USBPrinting/USBPrinterOutputDeviceManager.py @@ -103,10 +103,11 @@ class USBPrinterOutputDeviceManager(QObject, OutputDevicePlugin, Extension): self._firmware_view.show() - @pyqtSlot() - def updateAllFirmware(self): + @pyqtSlot(str) + def updateAllFirmware(self, file_name): + file_name = file_name.replace("file://", "") # File dialogs prepend the path with file://, which we don't need / want if not self._usb_output_devices: - Message(i18n_catalog.i18nc("@info","Cannot update firmware, there were no connected printers found.")).show() + Message(i18n_catalog.i18nc("@info", "Cannot update firmware, there were no connected printers found.")).show() return for printer_connection in self._usb_output_devices: @@ -114,26 +115,26 @@ class USBPrinterOutputDeviceManager(QObject, OutputDevicePlugin, Extension): self.spawnFirmwareInterface("") for printer_connection in self._usb_output_devices: try: - self._usb_output_devices[printer_connection].updateFirmware(Resources.getPath(CuraApplication.ResourceTypes.Firmware, self._getDefaultFirmwareName())) + self._usb_output_devices[printer_connection].updateFirmware(file_name) except FileNotFoundError: # Should only happen in dev environments where the resources/firmware folder is absent. self._usb_output_devices[printer_connection].setProgress(100, 100) - Logger.log("w", "No firmware found for printer %s called '%s'" %(printer_connection, self._getDefaultFirmwareName())) + Logger.log("w", "No firmware found for printer %s called '%s'" % (printer_connection, self.getDefaultFirmwareName())) Message(i18n_catalog.i18nc("@info", "Could not find firmware required for the printer at %s.") % printer_connection).show() self._firmware_view.close() continue - @pyqtSlot(str, result = bool) - def updateFirmwareBySerial(self, serial_port): + @pyqtSlot(str, str, result = bool) + def updateFirmwareBySerial(self, serial_port, file_name): if serial_port in self._usb_output_devices: self.spawnFirmwareInterface(self._usb_output_devices[serial_port].getSerialPort()) try: - self._usb_output_devices[serial_port].updateFirmware(Resources.getPath(CuraApplication.ResourceTypes.Firmware, self._getDefaultFirmwareName())) + self._usb_output_devices[serial_port].updateFirmware(file_name) except FileNotFoundError: self._firmware_view.close() - Logger.log("e", "Could not find firmware required for this machine called '%s'" %(self._getDefaultFirmwareName())) + Logger.log("e", "Could not find firmware required for this machine called '%s'" % (self.getDefaultFirmwareName())) return False return True return False @@ -147,7 +148,8 @@ class USBPrinterOutputDeviceManager(QObject, OutputDevicePlugin, Extension): return USBPrinterOutputDeviceManager._instance - def _getDefaultFirmwareName(self): + @pyqtSlot(result = str) + def getDefaultFirmwareName(self): # Check if there is a valid global container stack global_container_stack = Application.getInstance().getGlobalContainerStack() if not global_container_stack: @@ -193,13 +195,13 @@ class USBPrinterOutputDeviceManager(QObject, OutputDevicePlugin, Extension): Logger.log("d", "Choosing basic firmware for machine %s.", machine_id) hex_file = machine_without_extras[machine_id] # Return "basic" firmware else: - Logger.log("e", "There is no firmware for machine %s.", machine_id) + Logger.log("w", "There is no firmware for machine %s.", machine_id) if hex_file: - return hex_file.format(baudrate=baudrate) + return Resources.getPath(CuraApplication.ResourceTypes.Firmware, hex_file.format(baudrate=baudrate)) else: - Logger.log("e", "Could not find any firmware for machine %s.", machine_id) - raise FileNotFoundError() + Logger.log("w", "Could not find any firmware for machine %s.", machine_id) + return "" ## Helper to identify serial ports (and scan for them) def _addRemovePorts(self, serial_ports): diff --git a/plugins/UltimakerMachineActions/UpgradeFirmwareMachineAction.qml b/plugins/UltimakerMachineActions/UpgradeFirmwareMachineAction.qml index 0c9b80c010..ce2e2a39cb 100644 --- a/plugins/UltimakerMachineActions/UpgradeFirmwareMachineAction.qml +++ b/plugins/UltimakerMachineActions/UpgradeFirmwareMachineAction.qml @@ -5,6 +5,7 @@ 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 @@ -44,34 +45,45 @@ Cura.MachineAction anchors.topMargin: UM.Theme.getSize("default_margin").height width: parent.width wrapMode: Text.WordWrap - text: catalog.i18nc("@label", "The firmware shipping with new Ultimakers works, but upgrades have been made to make better prints, and make calibration easier."); + text: catalog.i18nc("@label", "The firmware shipping with new Printers works, but new versions tend to have more features and improvements."); } - Label - { - id: upgradeText2 - anchors.top: upgradeText1.bottom - anchors.topMargin: UM.Theme.getSize("default_margin").height - width: parent.width - wrapMode: Text.WordWrap - text: catalog.i18nc("@label", "Cura requires these new features and thus your firmware will most likely need to be upgraded. You can do so now."); - } Row { - anchors.top: upgradeText2.bottom + anchors.top: upgradeText1.bottom anchors.topMargin: UM.Theme.getSize("default_margin").height anchors.horizontalCenter: parent.horizontalCenter width: childrenRect.width spacing: UM.Theme.getSize("default_margin").width + property var firmwareName: Cura.USBPrinterManager.getDefaultFirmwareName() Button { - id: upgradeButton - text: catalog.i18nc("@action:button","Upgrade to Marlin Firmware"); + id: autoUpgradeButton + text: catalog.i18nc("@action:button", "Automatically upgrade Firmware"); + enabled: parent.firmwareName != "" onClicked: { - Cura.USBPrinterManager.updateAllFirmware() + Cura.USBPrinterManager.updateAllFirmware(parent.firmwareName) + } + } + Button + { + id: manualUpgradeButton + text: catalog.i18nc("@action:button", "Upload custom Firmware"); + onClicked: + { + customFirmwareDialog.open() } } } + + FileDialog + { + id: customFirmwareDialog + title: catalog.i18nc("@title:window", "Select custom firmware") + nameFilters: "Firmware image files (*.hex)" + selectExisting: true + onAccepted: Cura.USBPrinterManager.updateAllFirmware(fileUrl) + } } } \ No newline at end of file From de8785da3741023d934a818a99637c1f07c6742a Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Mon, 5 Sep 2016 15:48:31 +0200 Subject: [PATCH 2/3] All machines that suport USB connection now get the upgrade firmware action for free! CURA-955 --- .../UpgradeFirmwareMachineAction.py | 10 +++++++++- resources/definitions/fdmprinter.def.json | 3 ++- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/plugins/UltimakerMachineActions/UpgradeFirmwareMachineAction.py b/plugins/UltimakerMachineActions/UpgradeFirmwareMachineAction.py index 53476207fd..71d3f0b55b 100644 --- a/plugins/UltimakerMachineActions/UpgradeFirmwareMachineAction.py +++ b/plugins/UltimakerMachineActions/UpgradeFirmwareMachineAction.py @@ -1,9 +1,17 @@ from cura.MachineAction import MachineAction from UM.i18n import i18nCatalog +import cura.Settings.CuraContainerRegistry +import UM.Settings.DefinitionContainer catalog = i18nCatalog("cura") class UpgradeFirmwareMachineAction(MachineAction): def __init__(self): super().__init__("UpgradeFirmware", catalog.i18nc("@action", "Upgrade Firmware")) - self._qml_url = "UpgradeFirmwareMachineAction.qml" \ No newline at end of file + self._qml_url = "UpgradeFirmwareMachineAction.qml" + cura.Settings.CuraContainerRegistry.getInstance().containerAdded.connect(self._onContainerAdded) + + def _onContainerAdded(self, container): + # Add this action as a supported action to all machine definitions + if isinstance(container, UM.Settings.DefinitionContainer) and container.getMetaDataEntry("type") == "machine" and container.getMetaDataEntry("supports_usb_connection"): + UM.Application.getInstance().getMachineActionManager().addSupportedAction(container.getId(), self.getKey()) diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json index a219347f10..58bb170c21 100644 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -15,7 +15,8 @@ "machine_extruder_trains": { "0": "fdmextruder" - } + }, + "supports_usb_connection": true }, "settings": { From 9a28b0d4339b58f36f746a8323944f566d0d28e6 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Mon, 5 Sep 2016 16:20:12 +0200 Subject: [PATCH 3/3] Previously active tool is now set correctly once something is selected again CURA-1481 --- cura/CuraApplication.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index 2091eff5ed..892440cba0 100644 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -511,8 +511,6 @@ class CuraApplication(QtApplication): if self.getController().getActiveTool(): self._previous_active_tool = self.getController().getActiveTool().getPluginId() self.getController().setActiveTool(None) - else: - self._previous_active_tool = None def _onToolOperationStopped(self, event): if self._center_after_select: