virtual_sdcard: Don't wait for M25 in an SD gcode file

If an M25 is in a gcode file that is being printed from virtual SD, it
would cause a permanent hang.  Detect that case and don't wait for
those M25 commands.

Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
This commit is contained in:
Kevin O'Connor 2019-11-24 14:30:26 -05:00
parent ade65b90af
commit 05472bb8a3
1 changed files with 5 additions and 2 deletions

View File

@ -16,7 +16,7 @@ class VirtualSD:
self.file_position = self.file_size = 0 self.file_position = self.file_size = 0
# Work timer # Work timer
self.reactor = printer.get_reactor() self.reactor = printer.get_reactor()
self.must_pause_work = False self.must_pause_work = self.cmd_from_sd = False
self.work_timer = None self.work_timer = None
# Register commands # Register commands
self.gcode = printer.lookup_object('gcode') self.gcode = printer.lookup_object('gcode')
@ -64,7 +64,7 @@ class VirtualSD:
def do_pause(self): def do_pause(self):
if self.work_timer is not None: if self.work_timer is not None:
self.must_pause_work = True self.must_pause_work = True
while self.work_timer is not None: while self.work_timer is not None and not self.cmd_from_sd:
self.reactor.pause(self.reactor.monotonic() + .001) self.reactor.pause(self.reactor.monotonic() + .001)
# G-Code commands # G-Code commands
def cmd_error(self, params): def cmd_error(self, params):
@ -177,6 +177,7 @@ class VirtualSD:
self.reactor.pause(self.reactor.monotonic() + 0.100) self.reactor.pause(self.reactor.monotonic() + 0.100)
continue continue
# Dispatch command # Dispatch command
self.cmd_from_sd = True
try: try:
self.gcode.run_script(lines[-1]) self.gcode.run_script(lines[-1])
except self.gcode.error as e: except self.gcode.error as e:
@ -184,9 +185,11 @@ class VirtualSD:
except: except:
logging.exception("virtual_sdcard dispatch") logging.exception("virtual_sdcard dispatch")
break break
self.cmd_from_sd = False
self.file_position += len(lines.pop()) + 1 self.file_position += len(lines.pop()) + 1
logging.info("Exiting SD card print (position %d)", self.file_position) logging.info("Exiting SD card print (position %d)", self.file_position)
self.work_timer = None self.work_timer = None
self.cmd_from_sd = False
return self.reactor.NEVER return self.reactor.NEVER
def load_config(config): def load_config(config):