diff --git a/src/octoprint/plugins/virtual_printer/virtual.py b/src/octoprint/plugins/virtual_printer/virtual.py index 6a186d67..dff4f6d4 100644 --- a/src/octoprint/plugins/virtual_printer/virtual.py +++ b/src/octoprint/plugins/virtual_printer/virtual.py @@ -338,6 +338,8 @@ class VirtualPrinter(): self._triggerResend(expected=self.lastN) elif data == "drop_connection": self._debug_drop_connection = True + elif data == "maxtemp_error": + self.outgoing.put("Error: MAXTEMP triggered!") else: try: sleep_match = VirtualPrinter.sleep_regex.match(data) diff --git a/src/octoprint/server/api/settings.py b/src/octoprint/server/api/settings.py index 161b3294..39767cda 100644 --- a/src/octoprint/server/api/settings.py +++ b/src/octoprint/server/api/settings.py @@ -85,7 +85,8 @@ def getSettings(): "timeoutSdStatus": s.getFloat(["serial", "timeout", "sdStatus"]), "log": s.getBoolean(["serial", "log"]), "additionalPorts": s.get(["serial", "additionalPorts"]), - "longRunningCommands": s.get(["serial", "longRunningCommands"]) + "longRunningCommands": s.get(["serial", "longRunningCommands"]), + "ignoreErrorsFromFirmware": s.getBoolean(["serial", "ignoreErrorsFromFirmware"]) }, "folder": { "uploads": s.getBaseFolder("uploads"), @@ -226,6 +227,7 @@ def setSettings(): if "timeoutSdStatus" in data["serial"].keys(): s.setFloat(["serial", "timeout", "sdStatus"], data["serial"]["timeoutSdStatus"]) if "additionalPorts" in data["serial"] and isinstance(data["serial"]["additionalPorts"], (list, tuple)): s.set(["serial", "additionalPorts"], data["serial"]["additionalPorts"]) if "longRunningCommands" in data["serial"] and isinstance(data["serial"]["longRunningCommands"], (list, tuple)): s.set(["serial", "longRunningCommands"], data["serial"]["longRunningCommands"]) + if "ignoreErrorsFromFirmware" in data["serial"]: s.setBoolean(["serial", "ignoreErrorsFromFirmware"], data["serial"]["ignoreErrorsFromFirmware"]) oldLog = s.getBoolean(["serial", "log"]) if "log" in data["serial"].keys(): s.setBoolean(["serial", "log"], data["serial"]["log"]) diff --git a/src/octoprint/settings.py b/src/octoprint/settings.py index c90572c0..d58833c8 100644 --- a/src/octoprint/settings.py +++ b/src/octoprint/settings.py @@ -85,7 +85,8 @@ default_settings = { "sdStatus": 1 }, "additionalPorts": [], - "longRunningCommands": ["G4", "G28", "G29", "G30", "G32"] + "longRunningCommands": ["G4", "G28", "G29", "G30", "G32"], + "ignoreErrorsFromFirmware": False }, "server": { "host": "0.0.0.0", diff --git a/src/octoprint/static/js/app/viewmodels/settings.js b/src/octoprint/static/js/app/viewmodels/settings.js index 9bc36897..167946b6 100644 --- a/src/octoprint/static/js/app/viewmodels/settings.js +++ b/src/octoprint/static/js/app/viewmodels/settings.js @@ -136,6 +136,7 @@ $(function() { self.serial_log = ko.observable(undefined); self.serial_additionalPorts = ko.observable(undefined); self.serial_longRunningCommands = ko.observable(undefined); + self.serial_ignoreErrorsFromFirmware = ko.observable(undefined); self.folder_uploads = ko.observable(undefined); self.folder_timelapse = ko.observable(undefined); @@ -450,6 +451,7 @@ $(function() { self.serial_log(response.serial.log); self.serial_additionalPorts(response.serial.additionalPorts.join("\n")); self.serial_longRunningCommands(response.serial.longRunningCommands.join(", ")); + self.serial_ignoreErrorsFromFirmware(response.serial.ignoreErrorsFromFirmware); self.folder_uploads(response.folder.uploads); self.folder_timelapse(response.folder.timelapse); @@ -536,7 +538,8 @@ $(function() { "timeoutSdStatus": self.serial_timeoutSdStatus(), "log": self.serial_log(), "additionalPorts": commentableLinesToArray(self.serial_additionalPorts()), - "longRunningCommands": splitTextToArray(self.serial_longRunningCommands(), ",", true) + "longRunningCommands": splitTextToArray(self.serial_longRunningCommands(), ",", true), + "ignoreErrorsFromFirmware": self.serial_ignoreErrorsFromFirmware() }, "folder": { "uploads": self.folder_uploads(), diff --git a/src/octoprint/templates/dialogs/settings/serialconnection.jinja2 b/src/octoprint/templates/dialogs/settings/serialconnection.jinja2 index 2f4e00d0..84f3494e 100644 --- a/src/octoprint/templates/dialogs/settings/serialconnection.jinja2 +++ b/src/octoprint/templates/dialogs/settings/serialconnection.jinja2 @@ -84,4 +84,11 @@ {{ _('Use this to define additional glob patterns matching serial ports to list for connecting against, e.g. /dev/ttyAMA*. One entry per line.')|format(glob_url="http://docs.python.org/2/library/glob.html") }} +
+
+ +
+
diff --git a/src/octoprint/util/comm.py b/src/octoprint/util/comm.py index 02f8a9f8..f1bae87c 100644 --- a/src/octoprint/util/comm.py +++ b/src/octoprint/util/comm.py @@ -242,6 +242,8 @@ class MachineCom(object): self._resendSwallowRepetitions = settings().getBoolean(["feature", "ignoreIdenticalResends"]) self._resendSwallowRepetitionsCounter = 0 + self._ignore_errors = settings().getBoolean(["serial", "ignoreErrorsFromFirmware"]) + self._clear_to_send = CountedEvent(max=10, name="comm.clear_to_send") self._send_queue = TypedQueue() self._temperature_timer = None @@ -1371,9 +1373,13 @@ class MachineCom(object): #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) - eventManager().fire(Events.ERROR, {"error": self.getErrorString()}) + error_text = line[6:] if line.startswith("Error:") else line[2:] + if not self._ignore_errors: + self._errorValue = error_text + self._changeState(self.STATE_ERROR) + eventManager().fire(Events.ERROR, {"error": self.getErrorString()}) + else: + self._log("WARNING! Received an error from the printer's firmware, ignoring that as configured but you might want to investigate what happened here! Error: {}".format(error_text)) return line def _readline(self):