From 7b8bf2cf5c655961e1973c571dc5cdb10cc4c3ae Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gina=20H=C3=A4u=C3=9Fge?= Date: Thu, 27 Aug 2015 16:22:38 +0200 Subject: [PATCH] M112 support or the virtual printer (cherry picked from commit 22a6604) --- .../plugins/virtual_printer/virtual.py | 42 ++++++++++++------- src/octoprint/settings.py | 3 +- 2 files changed, 30 insertions(+), 15 deletions(-) diff --git a/src/octoprint/plugins/virtual_printer/virtual.py b/src/octoprint/plugins/virtual_printer/virtual.py index 3243cb62..b9596ec4 100644 --- a/src/octoprint/plugins/virtual_printer/virtual.py +++ b/src/octoprint/plugins/virtual_printer/virtual.py @@ -65,6 +65,7 @@ class VirtualPrinter(): self._heatupThread = None self._okBeforeCommandOutput = settings().getBoolean(["devel", "virtualPrinter", "okBeforeCommandOutput"]) + self._supportM112 = settings().getBoolean(["devel", "virtualPrinter", "supportM112"]) self._sendWait = settings().getBoolean(["devel", "virtualPrinter", "sendWait"]) self._waitInterval = settings().getFloat(["devel", "virtualPrinter", "waitInterval"]) @@ -83,6 +84,7 @@ class VirtualPrinter(): self._action_hooks = plugin_manager().get_hooks("octoprint.plugin.virtual_printer.custom_action") + self._killed = False waitThread = threading.Thread(target=self._sendWaitAfterTimeout) waitThread.start() @@ -106,7 +108,7 @@ class VirtualPrinter(): def _processIncoming(self): next_wait_timeout = time.time() + self._waitInterval - while self.incoming is not None: + while self.incoming is not None and not self._killed: self._simulateTemps() try: @@ -266,9 +268,10 @@ class VirtualPrinter(): elif "G92" in data: self._setPosition(data) - elif data.startswith("G0") or data.startswith("G1") or data.startswith("G2") or data.startswith("G3") \ - or data.startswith("G28") or data.startswith("G29") or data.startswith("G30") \ - or data.startswith("G31") or data.startswith("G32"): + elif data.startswith("G28"): + self._performMove(data) + + elif data.startswith("G0") or data.startswith("G1") or data.startswith("G2") or data.startswith("G3"): # simulate reprap buffered commands via a Queue with maxsize which internally simulates the moves self.buffered.put(data) @@ -291,6 +294,12 @@ class VirtualPrinter(): if len(data.strip()) > 0 and not self._okBeforeCommandOutput: self._sendOk() + def _kill(self): + if not self._supportM112: + return + self._killed = True + self._send("echo:EMERGENCY SHUTDOWN DETECTED. KILLED.") + def _triggerResend(self, expected=None, actual=None): with self._incoming_lock: if expected is None: @@ -521,14 +530,10 @@ class VirtualPrinter(): pass if duration: - if settings().getBoolean(["devel", "virtualPrinter", "waitOnLongMoves"]): - slept = 0 - while duration - slept > self._read_timeout: - time.sleep(self._read_timeout) - self.outgoing.put("wait") - slept += self._read_timeout - else: - time.sleep(duration) + slept = 0 + while duration - slept > self._read_timeout and not self._killed: + time.sleep(self._read_timeout) + slept += self._read_timeout def _setPosition(self, line): matchX = re.search("X([0-9.]+)", line) @@ -582,6 +587,9 @@ class VirtualPrinter(): self._selectedSdFilePos = 0 with open(self._selectedSdFile, "r") as f: for line in iter(f.readline, ""): + if self._killed: + break + # reset position if requested by client if self._newSdFilePos is not None: f.seek(self._newSdFilePos) @@ -611,12 +619,12 @@ class VirtualPrinter(): delay = 1 if heater.startswith("tool"): toolNum = int(heater[len("tool"):]) - while self.temp[toolNum] < self.targetTemp[toolNum] - delta or self.temp[toolNum] > self.targetTemp[toolNum] + delta: + while not self._killed and (self.temp[toolNum] < self.targetTemp[toolNum] - delta or self.temp[toolNum] > self.targetTemp[toolNum] + delta): self._simulateTemps(delta=delta) self.outgoing.put("T:%0.2f" % self.temp[toolNum]) time.sleep(delay) elif heater == "bed": - while self.bedTemp < self.bedTargetTemp - delta or self.bedTemp > self.bedTargetTemp + delta: + while not self._killed and (self.bedTemp < self.bedTargetTemp - delta or self.bedTemp > self.bedTargetTemp + delta): self._simulateTemps(delta=delta) self.outgoing.put("B:%0.2f" % self.bedTemp) time.sleep(delay) @@ -667,6 +675,12 @@ class VirtualPrinter(): with self._incoming_lock: if self.incoming is None or self.outgoing is None: return + + if "M112" in data and self._supportM112: + self._seriallog.info("<<< {}".format(data.strip())) + self._kill() + return + try: self.incoming.put(data, timeout=self._write_timeout) except Queue.Full: diff --git a/src/octoprint/settings.py b/src/octoprint/settings.py index 432baa3b..fa3f0e5f 100644 --- a/src/octoprint/settings.py +++ b/src/octoprint/settings.py @@ -292,7 +292,8 @@ default_settings = { "txBuffer": 40, "commandBuffer": 4, "sendWait": True, - "waitInterval": 1.0 + "waitInterval": 1.0, + "supportM112": True } } }