diff --git a/plugins/FirmwareUpdateChecker/FirmwareUpdateChecker.py b/plugins/FirmwareUpdateChecker/FirmwareUpdateChecker.py
index 3b58a56481..f20b8be584 100644
--- a/plugins/FirmwareUpdateChecker/FirmwareUpdateChecker.py
+++ b/plugins/FirmwareUpdateChecker/FirmwareUpdateChecker.py
@@ -1,11 +1,14 @@
# Copyright (c) 2015 Ultimaker B.V.
# Cura is released under the terms of the AGPLv3 or higher.
-
+from UM.Application import Application
from UM.Extension import Extension
from UM.Preferences import Preferences
+from UM.Logger import Logger
from UM.i18n import i18nCatalog
+from cura.Settings.GlobalStack import GlobalStack
from .FirmwareUpdateCheckerJob import FirmwareUpdateCheckerJob
+from UM.Settings.ContainerRegistry import ContainerRegistry
i18n_catalog = i18nCatalog("cura")
@@ -19,8 +22,18 @@ class FirmwareUpdateChecker(Extension):
def __init__(self):
super().__init__()
+ # Initialize the Preference called `latest_checked_firmware` that stores the last version
+ # checked for the UM3. In the future if we need to check other printers' firmware
Preferences.getInstance().addPreference("info/latest_checked_firmware", "")
- self.checkFirmwareVersion(True)
+
+ # Listen to a Signal that indicates a change in the active printer
+ ContainerRegistry.getInstance().containerAdded.connect(self._onContainerAdded)
+
+ def _onContainerAdded(self, container):
+ # Only take care when a new GlobaStack was added
+ if (isinstance(container, GlobalStack)):
+ Logger.log("i", "You have a '%s' in printer list. Let's check the firmware!" % container.getId())
+ self.checkFirmwareVersion(container, True)
## Connect with software.ultimaker.com, load latest.version and check version info.
# If the version info is different from the current version, spawn a message to
@@ -28,6 +41,6 @@ class FirmwareUpdateChecker(Extension):
#
# \param silent type(boolean) Suppresses messages other than "new version found" messages.
# This is used when checking for a new firmware version at startup.
- def checkFirmwareVersion(self, silent = False):
- job = FirmwareUpdateCheckerJob(silent = silent, url = self.url)
+ def checkFirmwareVersion(self, container = None, silent = False):
+ job = FirmwareUpdateCheckerJob(container = container, silent = silent, url = self.url)
job.start()
\ No newline at end of file
diff --git a/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py b/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py
index 913ac96025..9e0db57ed7 100644
--- a/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py
+++ b/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py
@@ -20,8 +20,9 @@ i18n_catalog = i18nCatalog("cura")
## This job checks if there is an update available on the provided URL.
class FirmwareUpdateCheckerJob(Job):
- def __init__(self, silent = False, url = None):
+ def __init__(self, container = None, silent = False, url = None):
super().__init__()
+ self._container = container
self.silent = silent
self._url = url
self._download_url = None # If an update was found, the download_url will be set to the location of the new version.
@@ -38,38 +39,44 @@ class FirmwareUpdateCheckerJob(Job):
Logger.log("e", "Can not check for a new release. URL not set!")
return
- Logger.log("i", "Checking for new version of firmware")
try:
request = urllib.request.Request(self._url)
current_version_file = urllib.request.urlopen(request)
reader = codecs.getreader("utf-8")
- # Nothing to parse, just get the string
- # TODO: In the future may be done by parsing a JSON file
- current_version = reader(current_version_file).readline().rstrip()
- Logger.log("i", "Reading firmware version: %s" % current_version)
+ machine_name = self._container.getId()
- # If it is the first time the version is checked, the checked_version is None
- checked_version = Preferences.getInstance().getValue("info/latest_checked_firmware")
- active_machine = Preferences.getInstance().getValue("cura/active_machine")
# If it is not None, then we compare between the checked_version and the current_version
- # Now we just do that if the active printer is Ultimaker 3 or Ultimaker 3 Extended
- if ((active_machine == "Ultimaker 3 Extended") or (active_machine == "Ultimaker 3"))\
- and ((checked_version is None) or (checked_version != current_version)):
- message = Message(i18n_catalog.i18nc("@info", "New %s firmware available
To ensure that your "
- "%s is equiped with the latest features it is recommended "
- "to update the firmware regularly. This can be done on the "
- "%s (when connected to the network) or via USB."
- % (active_machine, active_machine, active_machine)))
- message.addAction("download", i18n_catalog.i18nc("@action:button", "Download"), "[no_icon]", "[no_description]")
+ # Now we just do that if the active printer is Ultimaker 3 or Ultimaker 3 Extended or any
+ # other Ultimaker 3 that will come in the future
+ if (machine_name[0:11] == "Ultimaker 3"):
- # If we do this in a cool way, the download url should be available in the JSON file
- self._download_url = "https://ultimaker.com/en/resources/20500-upgrade-firmware"
- message.actionTriggered.connect(self.actionTriggered)
- # Sometimes it's shown, sometimes not
- #message.show()
- Application.getInstance().showMessage(message)
+ # Nothing to parse, just get the string
+ # TODO: In the future may be done by parsing a JSON file with diferent version for each printer model
+ current_version = reader(current_version_file).readline().rstrip()
+ Logger.log("i", "Reading firmware version of %s: %s" % (machine_name, current_version))
+ # If it is the first time the version is checked, the checked_version is None
+ checked_version = Preferences.getInstance().getValue("info/latest_checked_firmware")
+
+ # If the checked_version is '', it's because is the first time we check firmware and in this case
+ # we will not show the notification, but we will store it for the next time
+ if (checked_version != "") and (checked_version != current_version):
+ message = Message(i18n_catalog.i18nc("@info", "New %s firmware available
To ensure that your "
+ "%s is equiped with the latest features it is recommended "
+ "to update the firmware regularly. This can be done on the "
+ "%s (when connected to the network) or via USB."
+ % (machine_name, machine_name, machine_name)))
+ message.addAction("download", i18n_catalog.i18nc("@action:button", "Download"), "[no_icon]", "[no_description]")
+
+ # If we do this in a cool way, the download url should be available in the JSON file
+ self._download_url = "https://ultimaker.com/en/resources/20500-upgrade-firmware"
+ message.actionTriggered.connect(self.actionTriggered)
+ Application.getInstance().showMessage(message)
+
+ # The first time we want to store the current version, the notification will not be shown,
+ # because the new version of Cura will be release before the firmware and we don't want to
+ # notify the user when no new firmware version is available.
Preferences.getInstance().setValue("info/latest_checked_firmware", current_version)
except Exception as e: