Fixing #166 showed a deeper rooted issue with line number handling introduced with repetier/sdcard/gcodestreaming

Something like three wrongs led to one right. Core issue (not starting with line 0 but line 1 and not using the current line but the current line from the gcode file being sent, regardless of reset by M110) should now be rooted out.
master
Gina Häußge 2013-06-24 22:09:40 +02:00
parent bd61d45e27
commit ce9557798b
3 changed files with 55 additions and 53 deletions

View File

@ -215,7 +215,7 @@ class Printer():
# mark print as failure # mark print as failure
if self._selectedFile is not None: if self._selectedFile is not None:
self._gcodeManager.printFailed(self._selectedFile["filename"]) self._gcodeManager.printFailed(self._selectedFile["filename"])
eventManager().fire("PrintFailed", self._filename) eventManager().fire("PrintFailed", self._selectedFile["filename"])
#~~ state monitoring #~~ state monitoring

View File

@ -43,4 +43,4 @@ def getClass(name):
return m return m
def matchesGcode(line, gcode): def matchesGcode(line, gcode):
return re.search("^\s*%s\D" % gcode, line, re.I) return re.search("^%s(\D|$)" % gcode.strip(), line, re.I)

View File

@ -106,6 +106,12 @@ class VirtualPrinter():
if self.readList is None: if self.readList is None:
return return
# strip checksum
data = data.strip()
if "*" in data:
data = data[:data.rfind("*")]
data += "\n"
# shortcut for writing to SD # shortcut for writing to SD
if self._writingToSd and not self._selectedSdFile is None and not "M29" in data: if self._writingToSd and not self._selectedSdFile is None and not "M29" in data:
with open(self._selectedSdFile, "a") as f: with open(self._selectedSdFile, "a") as f:
@ -395,7 +401,7 @@ class MachineCom(object):
self._heatupWaitTimeLost = 0.0 self._heatupWaitTimeLost = 0.0
self._alwaysSendChecksum = settings().getBoolean(["feature", "alwaysSendChecksum"]) self._alwaysSendChecksum = settings().getBoolean(["feature", "alwaysSendChecksum"])
self._currentLine = 1 self._currentLine = 0
self._resendDelta = None self._resendDelta = None
self._lastLines = [] self._lastLines = []
@ -838,7 +844,7 @@ class MachineCom(object):
if lineToResend is not None: if lineToResend is not None:
self._resendDelta = self._currentLine - lineToResend self._resendDelta = self._currentLine - lineToResend
if self._resendDelta >= len(self._lastLines): if self._resendDelta > len(self._lastLines):
self._errorValue = "Printer requested line %d but no sufficient history is available, can't resend" % lineToResend self._errorValue = "Printer requested line %d but no sufficient history is available, can't resend" % lineToResend
self._logger.warn(self._errorValue) self._logger.warn(self._errorValue)
if self.isPrinting(): if self.isPrinting():
@ -904,13 +910,13 @@ class MachineCom(object):
# Make sure we are only handling one sending job at a time # Make sure we are only handling one sending job at a time
with self._sendingLock: with self._sendingLock:
self._logger.debug("Resending line %d, delta is %d, history log is %s items strong" % (self._currentLine - self._resendDelta, self._resendDelta, len(self._lastLines))) self._logger.debug("Resending line %d, delta is %d, history log is %s items strong" % (self._currentLine - self._resendDelta, self._resendDelta, len(self._lastLines)))
cmd = self._lastLines[-(self._resendDelta + 1)] cmd = self._lastLines[-self._resendDelta]
lineNumber = self._currentLine - self._resendDelta lineNumber = self._currentLine - self._resendDelta
self._doSendWithChecksum(cmd, lineNumber) self._doSendWithChecksum(cmd, lineNumber)
self._resendDelta -= 1 self._resendDelta -= 1
if self._resendDelta < 0: if self._resendDelta <= 0:
self._resendDelta = None self._resendDelta = None
def _sendCommand(self, cmd, sendChecksum=False): def _sendCommand(self, cmd, sendChecksum=False):
@ -919,48 +925,49 @@ class MachineCom(object):
if self._serial is None: if self._serial is None:
return return
for gcode in gcodeToEvent.keys(): if not self.isStreaming():
if matchesGcode(cmd, gcode): for gcode in gcodeToEvent.keys():
eventManager().fire(gcodeToEvent[gcode]) if matchesGcode(cmd, gcode):
eventManager().fire(gcodeToEvent[gcode])
if matchesGcode(cmd, "M109") or matchesGcode(cmd, "M190"): if matchesGcode(cmd, "M109") or matchesGcode(cmd, "M190"):
self._heatupWaitStartTime = time.time() self._heatupWaitStartTime = time.time()
if matchesGcode(cmd, "M104") or matchesGcode(cmd, "M109"): if matchesGcode(cmd, "M104") or matchesGcode(cmd, "M109"):
try:
self._targetTemp = float(re.search('S([0-9]+)', cmd).group(1))
except:
pass
if matchesGcode(cmd, "M140") or matchesGcode(cmd, "M190"):
try:
self._bedTargetTemp = float(re.search('S([0-9]+)', cmd).group(1))
except:
pass
if matchesGcode(cmd, "M110"):
newLineNumber = None
if " N" in cmd:
try: try:
newLineNumber = int(re.search("N([0-9]+)", cmd).group(1)) self._targetTemp = float(re.search('S([0-9]+)', cmd).group(1))
except:
pass
if matchesGcode(cmd, "M140") or matchesGcode(cmd, "M190"):
try:
self._bedTargetTemp = float(re.search('S([0-9]+)', cmd).group(1))
except: except:
pass pass
else:
newLineNumber = 0
if settings().getBoolean(["feature", "resetLineNumbersWithPrefixedN"]) and newLineNumber is not None: if matchesGcode(cmd, "M110"):
# let's rewrite the M110 command to fit repetier syntax newLineNumber = None
self._addToLastLines(cmd) if " N" in cmd:
self._doSendWithChecksum("M110", newLineNumber) try:
else: newLineNumber = int(re.search("N([0-9]+)", cmd).group(1))
self._doSend(cmd, sendChecksum) except:
pass
else:
newLineNumber = 0
if newLineNumber is not None: if settings().getBoolean(["feature", "resetLineNumbersWithPrefixedN"]) and newLineNumber is not None:
self._currentLine = newLineNumber + 1 # let's rewrite the M110 command to fit repetier syntax
self._addToLastLines(cmd)
self._doSendWithChecksum("M110", newLineNumber)
else:
self._doSend(cmd, sendChecksum)
# after a reset of the line number we have no way to determine what line exactly the printer now wants if newLineNumber is not None:
self._lastLines = [] self._currentLine = newLineNumber + 1
self._resendDelta = None
else: # after a reset of the line number we have no way to determine what line exactly the printer now wants
self._doSend(cmd, sendChecksum) self._lastLines = []
self._resendDelta = None
return
self._doSend(cmd, sendChecksum)
def _addToLastLines(self, cmd): def _addToLastLines(self, cmd):
self._lastLines.append(cmd) self._lastLines.append(cmd)
@ -970,10 +977,7 @@ class MachineCom(object):
def _doSend(self, cmd, sendChecksum=False): def _doSend(self, cmd, sendChecksum=False):
if sendChecksum or self._alwaysSendChecksum: if sendChecksum or self._alwaysSendChecksum:
if self._alwaysSendChecksum: lineNumber = self._currentLine
lineNumber = self._currentLine
else:
lineNumber = self._currentFile.getLineCount()
self._addToLastLines(cmd) self._addToLastLines(cmd)
self._currentLine += 1 self._currentLine += 1
self._doSendWithChecksum(cmd, lineNumber) self._doSendWithChecksum(cmd, lineNumber)
@ -1010,10 +1014,11 @@ class MachineCom(object):
if line is None: if line is None:
if self.isStreaming(): if self.isStreaming():
self._sendCommand("M29") self._sendCommand("M29")
filename = self._currentFile.getFilename()
self._currentFile = None self._currentFile = None
self._callback.mcFileTransferDone() self._callback.mcFileTransferDone()
self._changeState(self.STATE_OPERATIONAL) self._changeState(self.STATE_OPERATIONAL)
eventManager().fire("TransferDone", self._currentFile.getFilename()) eventManager().fire("TransferDone", filename)
else: else:
self._callback.mcPrintjobDone() self._callback.mcPrintjobDone()
self._changeState(self.STATE_OPERATIONAL) self._changeState(self.STATE_OPERATIONAL)
@ -1249,7 +1254,7 @@ class PrintingGcodeFileInformation(PrintingFileInformation):
def __init__(self, filename): def __init__(self, filename):
PrintingFileInformation.__init__(self, filename) PrintingFileInformation.__init__(self, filename)
self._filehandle = None self._filehandle = None
self._lineCount = 0 self._lineCount = None
self._firstLine = None self._firstLine = None
self._prevLineType = None self._prevLineType = None
@ -1262,7 +1267,7 @@ class PrintingGcodeFileInformation(PrintingFileInformation):
Opens the file for reading and determines the file size. Start time won't be recorded until 100 lines in Opens the file for reading and determines the file size. Start time won't be recorded until 100 lines in
""" """
self._filehandle = open(self._filename, "r") self._filehandle = open(self._filename, "r")
self._lineCount = 0 self._lineCount = None
self._prevLineType = "CUSTOM" self._prevLineType = "CUSTOM"
def getNext(self): def getNext(self):
@ -1272,8 +1277,8 @@ class PrintingGcodeFileInformation(PrintingFileInformation):
if self._filehandle is None: if self._filehandle is None:
raise ValueError("File %s is not open for reading" % self._filename) raise ValueError("File %s is not open for reading" % self._filename)
if self._lineCount == 0: if self._lineCount is None:
self._lineCount += 1 self._lineCount = 0
return "M110 N0" return "M110 N0"
try: try:
@ -1300,9 +1305,6 @@ class PrintingGcodeFileInformation(PrintingFileInformation):
self._filehandle = None self._filehandle = None
raise e raise e
def getLineCount(self):
return self._lineCount
def _processLine(self, line): def _processLine(self, line):
lineType = self._prevLineType lineType = self._prevLineType
if line.startswith(";TYPE:"): if line.startswith(";TYPE:"):