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
parent
bd61d45e27
commit
ce9557798b
|
@ -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
|
||||||
|
|
||||||
|
|
|
@ -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)
|
|
@ -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,6 +925,7 @@ class MachineCom(object):
|
||||||
if self._serial is None:
|
if self._serial is None:
|
||||||
return
|
return
|
||||||
|
|
||||||
|
if not self.isStreaming():
|
||||||
for gcode in gcodeToEvent.keys():
|
for gcode in gcodeToEvent.keys():
|
||||||
if matchesGcode(cmd, gcode):
|
if matchesGcode(cmd, gcode):
|
||||||
eventManager().fire(gcodeToEvent[gcode])
|
eventManager().fire(gcodeToEvent[gcode])
|
||||||
|
@ -959,7 +966,7 @@ class MachineCom(object):
|
||||||
# after a reset of the line number we have no way to determine what line exactly the printer now wants
|
# after a reset of the line number we have no way to determine what line exactly the printer now wants
|
||||||
self._lastLines = []
|
self._lastLines = []
|
||||||
self._resendDelta = None
|
self._resendDelta = None
|
||||||
else:
|
return
|
||||||
self._doSend(cmd, sendChecksum)
|
self._doSend(cmd, sendChecksum)
|
||||||
|
|
||||||
def _addToLastLines(self, cmd):
|
def _addToLastLines(self, 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:"):
|
||||||
|
|
Loading…
Reference in New Issue