M112 support or the virtual printer

(cherry picked from commit 22a6604)
This commit is contained in:
Gina Häußge 2015-08-27 16:22:38 +02:00
parent 9299cb54a4
commit 7b8bf2cf5c
2 changed files with 30 additions and 15 deletions

View file

@ -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:

View file

@ -292,7 +292,8 @@ default_settings = {
"txBuffer": 40,
"commandBuffer": 4,
"sendWait": True,
"waitInterval": 1.0
"waitInterval": 1.0,
"supportM112": True
}
}
}