diff --git a/src/octoprint/plugins/cura/__init__.py b/src/octoprint/plugins/cura/__init__.py
index 03653062..62f6770c 100644
--- a/src/octoprint/plugins/cura/__init__.py
+++ b/src/octoprint/plugins/cura/__init__.py
@@ -50,12 +50,10 @@ class CuraPlugin(octoprint.plugin.SlicerPlugin,
##~~ TemplatePlugin API
- def get_template_configs(self):
- from flask.ext.babel import gettext
- return [
- dict(type="settings", name=gettext("CuraEngine")),
- dict(type="wizard", name=gettext("CuraEngine"))
- ]
+ def get_template_vars(self):
+ return dict(
+ homepage=__plugin_url__
+ )
##~~ WizardPlugin API
@@ -522,10 +520,10 @@ def _get_usage_from_length(filament_length, filament_diameter):
return usage
-__plugin_name__ = "CuraEngine"
+__plugin_name__ = "CuraEngine (<= 15.04)"
__plugin_author__ = "Gina Häußge"
__plugin_url__ = "https://github.com/foosel/OctoPrint/wiki/Plugin:-Cura"
-__plugin_description__ = "Adds support for slicing via CuraEngine from within OctoPrint"
+__plugin_description__ = "Adds support for slicing via CuraEngine versions up to and including version 15.04 from within OctoPrint"
__plugin_license__ = "AGPLv3"
__plugin_implementation__ = CuraPlugin()
diff --git a/src/octoprint/plugins/cura/templates/_snippets/settings/cura/profileImporter.jinja2 b/src/octoprint/plugins/cura/templates/_snippets/settings/cura/profileImporter.jinja2
index 219f474a..1db74c08 100644
--- a/src/octoprint/plugins/cura/templates/_snippets/settings/cura/profileImporter.jinja2
+++ b/src/octoprint/plugins/cura/templates/_snippets/settings/cura/profileImporter.jinja2
@@ -50,6 +50,12 @@
+ {% trans %}
+ You can import your existing profile .ini files from Cura (version up to and
+ including 15.04) here. Please be aware that neither the .json profile format
+ from Cura versions starting with 15.06 is supported, nor are the custom Cura profile formats
+ that third party tools like e.g. Repetier create.
+ {% endtrans %}
diff --git a/src/octoprint/util/comm.py b/src/octoprint/util/comm.py
index 010e7c9b..3c5f00c3 100644
--- a/src/octoprint/util/comm.py
+++ b/src/octoprint/util/comm.py
@@ -277,6 +277,7 @@ class MachineCom(object):
self._serial_factory_hooks = self._pluginManager.get_hooks("octoprint.comm.transport.serial.factory")
# SD status data
+ self._sdEnabled = settings().getBoolean(["feature", "sdSupport"])
self._sdAvailable = False
self._sdFileList = False
self._sdFiles = []
@@ -776,21 +777,28 @@ class MachineCom(object):
return self._sdFiles
def startSdFileTransfer(self, filename):
- if not self.isOperational() or self.isBusy():
+ if not self._sdEnabled:
return
+ if not self.isOperational() or self.isBusy():
+ return
self._changeState(self.STATE_TRANSFERING_FILE)
self.sendCommand("M28 %s" % filename.lower())
def endSdFileTransfer(self, filename):
- if not self.isOperational() or self.isBusy():
+ if not self._sdEnabled:
return
+ if not self.isOperational() or self.isBusy():
+ return
self.sendCommand("M29 %s" % filename.lower())
self._changeState(self.STATE_OPERATIONAL)
self.refreshSdFiles()
def deleteSdFile(self, filename):
+ if not self._sdEnabled:
+ return
+
if not self.isOperational() or (self.isBusy() and
isinstance(self._currentFile, PrintingSdFileInformation) and
self._currentFile.getFilename() == filename):
@@ -801,13 +809,21 @@ class MachineCom(object):
self.refreshSdFiles()
def refreshSdFiles(self):
+ if not self._sdEnabled:
+ return
+
if not self.isOperational() or self.isBusy():
return
+
self.sendCommand("M20")
def initSdCard(self):
+ if not self._sdEnabled:
+ return
+
if not self.isOperational():
return
+
self.sendCommand("M21")
if settings().getBoolean(["feature", "sdAlwaysAvailable"]):
self._sdAvailable = True
@@ -815,6 +831,9 @@ class MachineCom(object):
self._callback.on_comm_sd_state_change(self._sdAvailable)
def releaseSdCard(self):
+ if not self._sdEnabled:
+ return
+
if not self.isOperational() or (self.isBusy() and self.isSdFileSelected()):
# do not release the sd card if we are currently printing from it
return
@@ -1398,6 +1417,9 @@ class MachineCom(object):
or "error writing to file" in line.lower():
#Also skip errors with the SD card
pass
+ elif 'unknown command' in line.lower():
+ #Ignore unkown command errors, it could be a typo or some missing feature
+ pass
elif not self.isError():
self._errorValue = line[6:] if line.startswith("Error:") else line[2:]
self._changeState(self.STATE_ERROR)