diff --git a/GCodeAnalyzer.py b/GCodeAnalyzer.py index aa2a5bc..8a69557 100644 --- a/GCodeAnalyzer.py +++ b/GCodeAnalyzer.py @@ -33,32 +33,35 @@ import re class GCodeAnalyzer(): - def __init__(self): - self.x = 0 - self.y = 0 - self.z = 0 - self.e = 0 - self.emax = 0 - self.f = 1000 - self.lastX = 0 - self.lastY = 0 - self.lastZ = 0 - self.lastE = 0 - self.xOffset = 0 - self.yOffset = 0 - self.zOffset = 0 - self.eOffset = 0 - self.lastZPrint = 0 - self.layerZ = 0 - self.relative = False - self.eRelative = False - self.homeX = 0 - self.homeY = 0 - self.homeZ = 0 - self.maxX = 150 - self.maxY = 150 - self.maxZ = 150 - + def __init__(self): + self.x = 0 + self.y = 0 + self.z = 0 + self.e = 0 + self.emax = 0 + self.f = 1000 + self.lastX = 0 + self.lastY = 0 + self.lastZ = 0 + self.lastE = 0 + self.xOffset = 0 + self.yOffset = 0 + self.zOffset = 0 + self.eOffset = 0 + self.lastZPrint = 0 + self.layerZ = 0 + self.relative = False + self.eRelative = False + self.homeX = 0 + self.homeY = 0 + self.homeZ = 0 + self.maxX = 150 + self.maxY = 150 + self.maxZ = 150 + self.hasHomeX = False + self.hasHomeY = False + self.hasHomeZ = False + # find a code in a gstring line def findCode(self, gcode, codeStr): @@ -66,112 +69,129 @@ class GCodeAnalyzer(): m=re.match(pattern, gcode) if m == None: return None - else + else: return m.group(1) - + def Analyze(self, gcode): - code_g = self.findCode(gcode, "G") - code_m = self.findCode(gcode, "M") + code_g = self.findCode(gcode, "G") + code_m = self.findCode(gcode, "M") + # we have a g_code + if code_g != None: + code_g = int(code_g) + + #get movement codes + if code_g == 0 or code_g == 1 or code_g == 2 or code_g == 3: + self.lastX = self.x + self.lastY = self.y + self.lastZ = self.z + self.lastE = self.e + eChanged = false; + code_f = self.findCode(gcode, "F") + if code_f != None: + self.f=float(code_f) + + code_x = self.findCode(gcode, "X") + code_y = self.findCode(gcode, "Y") + code_z = self.findCode(gcode, "Z") + code_e = self.findCode(gcode, "E") - # we have a g_code - if code_g != None: - code_g = int(code_g) - - #get movement codes - if code_g == 0 or code_g == 1 or code_g == 2 or code_g == 3: - eChanged = false; - code_f = self.findCode(gcode, "F") - if code_f != None: - self.f=float(code_f) - - code_x = self.findCode(gcode, "X") - code_y = self.findCode(gcode. "Y") - code_z = self.findCode(gcode, "Z") - code_e = self.findCode(gcode, "E") - - if self.relative: - if code_x != None: self.x += float(code_x) - if code_y != None: self.y += float(code_y) - if code_z != None: self.z += float(code_z) - if code_e != None: - e = float(code_e) - if e != 0: - eChanged = True - self.e += e - else: - #absolute coordinates - if code_x != None: self.x = self.xOffset + float(code_x) - if code_y != None: self.y = self.yOffset + float(code_y) - if code_z != None: self.z = self.zOffset + float(code_z) - if code_e != None: - e = float(code_e) - if self.eRelative: - if e != 0: - eChanged = True - self.e += e - else: - # e is absolute. Is it changed? - if self.e != self.eOffset + e: - eChanged = True - self.e = self.eOffset + e - #Repetier has a bunch of limit-checking code here and time calculations: we are leaving them for now - - elif code_g == 28 or code_g == 161: - code_x = self.findCode(gcode, "X") - code_y = self.findCode(gcode, "Y") - code_z = self.findCode(gcode, "Z") - code_e = self.findCode(gcode, "E") - homeAll = False - if code_x == None and code_y == None and code_z == None: homeAll = True - if code_x != None or homeAll: - self.xOffset = 0 - self.x = self.homeX - if code_y != None or homeAll: - self.yOffset = 0 - self.y = self.homeY - if code_z != None or homeAll: - self.zOffset = 0 - self.z = self.homeZ - if code_e != None: - self.eOffset = 0 - self.e = 0 - elif code_g == 162: - code_x = self.findCode(gcode, "X") - code_y = self.findCode(gcode, "Y") - code_z = self.findCode(gcode, "Z") - homeAll = False - if code_x == None and code_y == None and code_z == None: homeAll = True - if code_x != None or homeAll: - self.xOffset = 0 - self.x = self.maxX - if code_y != None or homeAll: - self.yOffset = 0 - self.y = self.maxY - if code_z != None or homeAll: - self.zOffset = 0 - self.z = self.maxZ - elif code_g == 90: self.relative = False - elif code_g == 91: self.relative = True - elif code_g == 92: - code_x = self.findCode(gcode, "X") - code_y = self.findCode(gcode, "Y") - code_z = self.findCode(gcode, "Z") - code_e = self.findCode(gcode, "E") - if code_x != None: - self.xOffset = self.x - float(code_x) - self.x = self.xOffset - if code_y != None: - self.yOffset = self.y - float(code_y) - self.y = self.yOffset - if code_z != None: - self.zOffset = self.z - float(code_z) - self.z = self.zOffset - if code_e != None: - self.xOffset = self.e - float(code_e) - self.e = self.eOffset + if self.relative: + if code_x != None: self.x += float(code_x) + if code_y != None: self.y += float(code_y) + if code_z != None: self.z += float(code_z) + if code_e != None: + e = float(code_e) + if e != 0: + eChanged = True + self.e += e + else: + #absolute coordinates + if code_x != None: self.x = self.xOffset + float(code_x) + if code_y != None: self.y = self.yOffset + float(code_y) + if code_z != None: self.z = self.zOffset + float(code_z) + if code_e != None: + e = float(code_e) + if self.eRelative: + if e != 0: + eChanged = True + self.e += e + else: + # e is absolute. Is it changed? + if self.e != self.eOffset + e: + eChanged = True + self.e = self.eOffset + e + #Repetier has a bunch of limit-checking code here and time calculations: we are leaving them for now + elif code_g == 28 or code_g == 161: + self.lastX = self.x + self.lastY = self.y + self.lastZ = self.z + self.lastE = self.e + code_x = self.findCode(gcode, "X") + code_y = self.findCode(gcode, "Y") + code_z = self.findCode(gcode, "Z") + code_e = self.findCode(gcode, "E") + homeAll = False + if code_x == None and code_y == None and code_z == None: homeAll = True + if code_x != None or homeAll: + self.hasHomeX = True + self.xOffset = 0 + self.x = self.homeX + if code_y != None or homeAll: + self.hasHomeY = True + self.yOffset = 0 + self.y = self.homeY + if code_z != None or homeAll: + self.hasHomeZ = True + self.zOffset = 0 + self.z = self.homeZ + if code_e != None: + self.eOffset = 0 + self.e = 0 + elif code_g == 162: + self.lastX = self.x + self.lastY = self.y + self.lastZ = self.z + self.lastE = self.e + code_x = self.findCode(gcode, "X") + code_y = self.findCode(gcode, "Y") + code_z = self.findCode(gcode, "Z") + homeAll = False + if code_x == None and code_y == None and code_z == None: homeAll = True + if code_x != None or homeAll: + self.hasHomeX = True + self.xOffset = 0 + self.x = self.maxX + if code_y != None or homeAll: + self.hasHomeY = True + self.yOffset = 0 + self.y = self.maxY + if code_z != None or homeAll: + self.hasHomeZ = True + self.zOffset = 0 + self.z = self.maxZ + elif code_g == 90: self.relative = False + elif code_g == 91: self.relative = True + elif code_g == 92: + code_x = self.findCode(gcode, "X") + code_y = self.findCode(gcode, "Y") + code_z = self.findCode(gcode, "Z") + code_e = self.findCode(gcode, "E") + if code_x != None: + self.xOffset = self.x - float(code_x) + self.x = self.xOffset + if code_y != None: + self.yOffset = self.y - float(code_y) + self.y = self.yOffset + if code_z != None: + self.zOffset = self.z - float(code_z) + self.z = self.zOffset + if code_e != None: + self.xOffset = self.e - float(code_e) + self.e = self.eOffset #End code_g != None if code_m != None: - code_m = int(code_m) - if code_m == 82: self.eRelative = False - elif code_m == 83: self.eRelative = True - \ No newline at end of file + code_m = int(code_m) + if code_m == 82: self.eRelative = False + elif code_m == 83: self.eRelative = True + + \ No newline at end of file diff --git a/printcore.py b/printcore.py index bb6501c..a96e004 100755 --- a/printcore.py +++ b/printcore.py @@ -20,6 +20,7 @@ from threading import Thread from select import error as SelectError import time, getopt, sys import platform, os +from GCodeAnalyzer import GCodeAnalyzer def control_ttyhup(port, disable_hup): """Controls the HUPCL""" @@ -70,6 +71,8 @@ class printcore(): if port is not None and baud is not None: self.connect(port, baud) + self.analyzer = GCodeAnalyzer() + def disconnect(self): """Disconnects from printer and pauses the print """ @@ -335,6 +338,7 @@ class printcore(): self.sentlines[lineno] = command if self.printer: self.sent.append(command) + self.analyzer.Analyze(command) # run the command through the analyzer if self.loud: print "SENT: ", command if self.sendcb: