From 069bfdd9f889c0a55a1806fda5867cb826ea382e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gina=20H=C3=A4u=C3=9Fge?= Date: Thu, 10 Mar 2016 15:58:59 +0100 Subject: [PATCH] New flag to have M29 response inject "ok" Adjusted virtual printer to allow marking of M29 as broken re sending of ok. Fixes #1273 --- src/octoprint/plugins/virtual_printer/virtual.py | 4 ++++ src/octoprint/server/api/settings.py | 2 ++ src/octoprint/settings.py | 8 ++++++-- src/octoprint/static/js/app/viewmodels/settings.js | 5 ++++- .../templates/dialogs/settings/serialconnection.jinja2 | 5 +++++ src/octoprint/util/comm.py | 7 +++++++ 6 files changed, 28 insertions(+), 3 deletions(-) diff --git a/src/octoprint/plugins/virtual_printer/virtual.py b/src/octoprint/plugins/virtual_printer/virtual.py index 45f89062..6a2edba6 100644 --- a/src/octoprint/plugins/virtual_printer/virtual.py +++ b/src/octoprint/plugins/virtual_printer/virtual.py @@ -73,6 +73,8 @@ class VirtualPrinter(): self._echoOnM117 = settings().getBoolean(["devel", "virtualPrinter", "echoOnM117"]) + self._brokenM29 = settings().getBoolean(["devel", "virtualPrinter", "brokenM29"]) + self.currentLine = 0 self.lastN = 0 @@ -223,6 +225,8 @@ class VirtualPrinter(): elif 'M29' in data: if self._sdCardReady: self._finishSdFile() + if self._brokenM29: + continue elif 'M30' in data: if self._sdCardReady: filename = data.split(None, 1)[1].strip() diff --git a/src/octoprint/server/api/settings.py b/src/octoprint/server/api/settings.py index 49d92e98..2a7a29e2 100644 --- a/src/octoprint/server/api/settings.py +++ b/src/octoprint/server/api/settings.py @@ -90,6 +90,7 @@ def getSettings(): "helloCommand": s.get(["serial", "helloCommand"]), "ignoreErrorsFromFirmware": s.getBoolean(["serial", "ignoreErrorsFromFirmware"]), "disconnectOnErrors": s.getBoolean(["serial", "disconnectOnErrors"]), + "triggerOkForM29": s.getBoolean(["serial", "triggerOkForM29"]) }, "folder": { "uploads": s.getBaseFolder("uploads"), @@ -234,6 +235,7 @@ def setSettings(): if "helloCommand" in data["serial"]: s.set(["serial", "helloCommand"], data["serial"]["helloCommand"]) if "ignoreErrorsFromFirmware" in data["serial"]: s.setBoolean(["serial", "ignoreErrorsFromFirmware"], data["serial"]["ignoreErrorsFromFirmware"]) if "disconnectOnErrors" in data["serial"]: s.setBoolean(["serial", "disconnectOnErrors"], data["serial"]["disconnectOnErrors"]) + if "triggerOkForM29" in data["serial"]: s.setBoolean(["serial", "triggerOkForM29"], data["serial"]["triggerOkForM29"]) 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 72ef69ec..863dede0 100644 --- a/src/octoprint/settings.py +++ b/src/octoprint/settings.py @@ -90,7 +90,10 @@ default_settings = { "helloCommand": "M110 N0", "disconnectOnErrors": True, "ignoreErrorsFromFirmware": False, - "logResends": False + "logResends": False, + + # command specific flags + "triggerOkForM29": True }, "server": { "host": "0.0.0.0", @@ -308,7 +311,8 @@ default_settings = { "sendWait": True, "waitInterval": 1.0, "supportM112": True, - "echoOnM117": True + "echoOnM117": True, + "brokenM29": True } } } diff --git a/src/octoprint/static/js/app/viewmodels/settings.js b/src/octoprint/static/js/app/viewmodels/settings.js index 4e7b79dc..34fc874e 100644 --- a/src/octoprint/static/js/app/viewmodels/settings.js +++ b/src/octoprint/static/js/app/viewmodels/settings.js @@ -140,6 +140,7 @@ $(function() { self.serial_helloCommand = ko.observable(undefined); self.serial_ignoreErrorsFromFirmware = ko.observable(undefined); self.serial_disconnectOnErrors = ko.observable(undefined); + self.serial_triggerOkForM29 = ko.observable(undefined); self.folder_uploads = ko.observable(undefined); self.folder_timelapse = ko.observable(undefined); @@ -458,6 +459,7 @@ $(function() { self.serial_helloCommand(response.serial.helloCommand); self.serial_ignoreErrorsFromFirmware(response.serial.ignoreErrorsFromFirmware); self.serial_disconnectOnErrors(response.serial.disconnectOnErrors); + self.serial_triggerOkForM29(response.serial.triggerOkForM29); self.folder_uploads(response.folder.uploads); self.folder_timelapse(response.folder.timelapse); @@ -548,7 +550,8 @@ $(function() { "checksumRequiringCommands": splitTextToArray(self.serial_checksumRequiringCommands(), ",", true), "helloCommand": self.serial_helloCommand(), "ignoreErrorsFromFirmware": self.serial_ignoreErrorsFromFirmware(), - "disconnectOnErrors": self.serial_disconnectOnErrors() + "disconnectOnErrors": self.serial_disconnectOnErrors(), + "triggerOkForM29": self.serial_triggerOkForM29() }, "folder": { "uploads": self.folder_uploads(), diff --git a/src/octoprint/templates/dialogs/settings/serialconnection.jinja2 b/src/octoprint/templates/dialogs/settings/serialconnection.jinja2 index e871184f..799796f9 100644 --- a/src/octoprint/templates/dialogs/settings/serialconnection.jinja2 +++ b/src/octoprint/templates/dialogs/settings/serialconnection.jinja2 @@ -116,6 +116,11 @@ {{ _('Use this to specify which commands always need to be sent with a checksum. Comma separated list.') }} +
+ +
diff --git a/src/octoprint/util/comm.py b/src/octoprint/util/comm.py index a96534f0..0da78fbe 100644 --- a/src/octoprint/util/comm.py +++ b/src/octoprint/util/comm.py @@ -230,6 +230,7 @@ class MachineCom(object): self._timeout = None self._hello_command = settings().get(["serial", "helloCommand"]) + self._trigger_ok_for_m29 = settings().getBoolean(["serial", "triggerOkForM29"]) self._alwaysSendChecksum = settings().getBoolean(["feature", "alwaysSendChecksum"]) self._sendChecksumWithUnknownCommands = settings().getBoolean(["feature", "sendChecksumWithUnknownCommands"]) @@ -1091,6 +1092,12 @@ class MachineCom(object): pass elif 'Done saving file' in line: self.refreshSdFiles() + + if self._trigger_ok_for_m29: + # workaround for most versions of Marlin out in the wild + # not sending an ok after saving a file + self._clear_to_send.set() + line, lower_line = convert_line("ok") elif 'File deleted' in line and line.strip().endswith("ok"): # buggy Marlin version that doesn't send a proper \r after the "File deleted" statement, fixed in # current versions