Use M26 to reset SD position to 0 when cancelling and restarting a print, preprocess gcode before sending to printer

master
Gina Häußge 2013-05-21 23:30:29 +02:00
parent eeddf0ae1a
commit 45fef79e3d
3 changed files with 25 additions and 9 deletions

View File

@ -619,9 +619,13 @@ class SdFileStreamer(threading.Thread):
with open(self._file, "r") as f:
self._comm.startSdFileTransfer(sdFilename)
for line in f:
self._comm.sendCommand(line)
if ";" in line:
line = line[0:line.find(";")]
line = line.strip()
if len(line) > 0:
self._comm.sendCommand(line)
time.sleep(0.001) # do not send too fast
self._progressCallback(sdFilename, float(f.tell()) / float(size))
time.sleep(0.001) # do not send too fast
finally:
self._comm.endSdFileTransfer(sdFilename)
self._finishCallback(sdFilename)

View File

@ -291,7 +291,7 @@ function PrinterStateViewModel(loginStateViewModel) {
self._processSdUploadData = function(data) {
if (self.isLoading()) {
var progress = Math.round(data.progress * 100);
self.filename("Streaming to SD... (" + progress + "%)");
self.filename("Streaming... (" + progress + "%)");
}
}

View File

@ -71,6 +71,7 @@ class VirtualPrinter():
self._selectedSdFileSize = None
self._selectedSdFilePos = None
self._writingToSd = False
self._newSdFilePos = None
def write(self, data):
if self.readList is None:
@ -105,6 +106,9 @@ class VirtualPrinter():
self._startSdPrint()
elif 'M25' in data:
self._pauseSdPrint()
elif 'M26' in data:
pos = int(re.search("S([0-9]+)", data).group(1))
self._setSdPos(pos)
elif 'M27' in data:
self._reportSdStatus()
elif 'M28' in data:
@ -147,6 +151,9 @@ class VirtualPrinter():
self._sdPrintingSemaphore.clear()
self.readList.append("ok")
def _setSdPos(self, pos):
self._newSdFilePos = pos
def _reportSdStatus(self):
if self._sdPrinter is not None and self._sdPrintingSemaphore.is_set:
self.readList.append("SD printing byte %d/%d" % (self._selectedSdFilePos, self._selectedSdFileSize))
@ -174,8 +181,12 @@ class VirtualPrinter():
self._selectedSdFilePos = 0
with open(self._selectedSdFile, "rb") as f:
for line in f:
# reset position if requested by client
if self._newSdFilePos is not None:
f.seek(self._newSdFilePos)
self._newSdFilePos = None
# read current file position
print("Progress: %d (%d / %d)" % ((round(self._selectedSdFilePos * 100 / self._selectedSdFileSize)), self._selectedSdFilePos, self._selectedSdFileSize))
self._selectedSdFilePos = f.tell()
# if we are paused, wait for unpausing
@ -193,8 +204,6 @@ class VirtualPrinter():
except:
pass
print line
time.sleep(0.01)
self._sdPrintingSemaphore.clear()
@ -373,7 +382,7 @@ class MachineCom(object):
if self._state == self.STATE_CLOSED_WITH_ERROR:
return "Error: %s" % (self.getShortErrorString())
if self._state == self.STATE_RECEIVING_FILE:
return "Streaming file to SD"
return "Sending file to SD"
return "?%d?" % (self._state)
def getShortErrorString(self):
@ -792,6 +801,8 @@ class MachineCom(object):
if not self.isOperational() or self.isPrinting():
return
if self.isPaused():
self.sendCommand("M26 S0") # reset position in file to byte 0
self.sendCommand("M24")
self._printSection = 'CUSTOM'
@ -803,7 +814,8 @@ class MachineCom(object):
if self.isOperational():
self._changeState(self.STATE_OPERATIONAL)
if self._sdPrinting:
self.sendCommand("M25")
self.sendCommand("M25") # pause print
self.sendCommand("M26 S0") # reset position in file to byte 0
def setPause(self, pause):
if not pause and self.isPaused():
@ -816,7 +828,7 @@ class MachineCom(object):
if pause and self.isPrinting():
self._changeState(self.STATE_PAUSED)
if self._sdPrinting:
self.sendCommand("M25")
self.sendCommand("M25") # pause print
def setFeedrateModifier(self, type, value):
self._feedRateModifier[type] = value