mirror of
https://github.com/BKLronin/touchCNC.git
synced 2024-10-18 17:44:01 +02:00
315 lines
9.7 KiB
Python
315 lines
9.7 KiB
Python
|
grbl = 0
|
||
|
port = None
|
||
|
i = 10
|
||
|
GCODE = 0
|
||
|
gcode_to_stream = []
|
||
|
countbuf = 0
|
||
|
writebuffer_byPass = []
|
||
|
writebuffer = []
|
||
|
readbuffer = []
|
||
|
AXIS = 'X'
|
||
|
states = {'M3': '0', 'M8': '0', 'M6': '0', 'G10': '0'} # Spindle, Coolant, Toolchange
|
||
|
dict_GCODE = {'G': '0',
|
||
|
'X': '0',
|
||
|
'Y': '0',
|
||
|
'Z': '0',
|
||
|
'I': '0',
|
||
|
'J': '0',
|
||
|
'F': '0'
|
||
|
}
|
||
|
|
||
|
# GUI Main
|
||
|
buttonsize_x = 5
|
||
|
buttonsize_y = 3
|
||
|
increments = 0
|
||
|
BORDER = 2
|
||
|
freetosend = 1
|
||
|
|
||
|
# GUI Color Scheme
|
||
|
attention = 'red'
|
||
|
loaded = 'green'
|
||
|
cooling = 'blue'
|
||
|
toolchange = 'yellow'
|
||
|
standard = '#17223B'
|
||
|
feed = '#283B67'
|
||
|
|
||
|
|
||
|
def grblConnect2():
|
||
|
global grbl
|
||
|
global port
|
||
|
|
||
|
# Serial Connection
|
||
|
locations = ['/dev/ttyACM0', '/dev/ttyUSB0', '/dev/ttyUSB1', '/dev/ttyACM1', '/dev/ttyACM2', '/dev/ttyACM3',
|
||
|
'/dev/ttyS0', '/dev/ttyS1', '/dev/ttyS2', '/dev/ttyS3']
|
||
|
|
||
|
for device in locations:
|
||
|
try:
|
||
|
# print([comport.device for comport in serial.tools.list_ports.comports()])
|
||
|
print("Trying...", device)
|
||
|
grbl = serial.Serial(port=device, baudrate=115200, timeout=.5) # dsrdtr= True)
|
||
|
port = device
|
||
|
# grbl.open()
|
||
|
# print(grbl.readline())
|
||
|
grbl.write(str.encode("\r\n\r\n"))
|
||
|
time.sleep(2) # Wait for grbl to initialize
|
||
|
grbl.flushInput() # Flush startup text in serial input
|
||
|
connect_ser.config(bg=loaded)
|
||
|
# print("connected")
|
||
|
|
||
|
break
|
||
|
except:
|
||
|
# print ("Failed to connect on",device)
|
||
|
grbl = 0
|
||
|
|
||
|
# Stream g-code to grbl
|
||
|
# Stream GCODE from -https://onehossshay.wordpress.com/2011/08/26/grbl-a-simple-python-interface/-
|
||
|
|
||
|
|
||
|
def jogWrite(AXIS, CMD, scale): # Schreiben von manuellen Positionierungsbefehlen
|
||
|
global freetosend
|
||
|
|
||
|
DECIMAL = [0.1, 1, 10, 100]
|
||
|
scale = increments.get()
|
||
|
MOVE = int(CMD) * DECIMAL[scale - 1]
|
||
|
grbl_command = ('$J=G91' + 'G21' + AXIS + str(MOVE) + 'F1000')
|
||
|
# print(grbl_command) $J=G91G21X10F185
|
||
|
grbl_gcode_send.send_gcode(grbl, grbl_command)
|
||
|
|
||
|
|
||
|
def switchButtonState(button): # Umschalter für Knopfstatus
|
||
|
if button["state"] == DISABLED:
|
||
|
button["state"] = NORMAL
|
||
|
else:
|
||
|
button["state"] = DISABLED
|
||
|
|
||
|
|
||
|
def directWrite(CMD): # Direktes schreiben eines Befehls
|
||
|
global freetosend
|
||
|
# print(freetosend)
|
||
|
grbl_command = CMD
|
||
|
|
||
|
grbl_gcode_send.send_gcode(grbl, grbl_command)
|
||
|
|
||
|
|
||
|
def latchWrite(CMD):
|
||
|
global states
|
||
|
global freetosend
|
||
|
if states[CMD] == '0':
|
||
|
states[CMD] = '1'
|
||
|
if CMD == 'M3':
|
||
|
spindle.config(bg=attention) # A31621
|
||
|
if CMD == 'M6':
|
||
|
tool.config(bg=toolchange) # E0CA3C
|
||
|
if CMD == 'G10':
|
||
|
zero_all.config(bg=loaded)
|
||
|
|
||
|
else:
|
||
|
states[CMD] = '0'
|
||
|
if CMD == 'M3':
|
||
|
spindle.config(bg=loaded) # A2D729
|
||
|
if CMD == 'M6':
|
||
|
tool.config(bg='grey')
|
||
|
# if CMD == 'G10':
|
||
|
# zero_all.config(bg= attention)
|
||
|
|
||
|
if CMD == 'M3':
|
||
|
if states['M3'] == '1':
|
||
|
grbl_command = 'M3 S1000'
|
||
|
else:
|
||
|
grbl_command = 'M3 S0'
|
||
|
|
||
|
elif CMD == 'M8':
|
||
|
if states['M8'] == '1':
|
||
|
grbl_command = (CMD)
|
||
|
coolant.config(bg=cooling) # 1F7A8C
|
||
|
else:
|
||
|
grbl_command = 'M9'
|
||
|
coolant.config(bg='grey')
|
||
|
|
||
|
elif CMD == 'G10':
|
||
|
grbl_command = 'G10 P0 L20 X0 Y0 Z0'
|
||
|
|
||
|
else:
|
||
|
grbl_command = (CMD)
|
||
|
|
||
|
# grbl_command = (CMD * int(states[CMD]) )
|
||
|
# print(grbl_command)
|
||
|
# print(states)
|
||
|
|
||
|
grbl_gcode_send.send_gcode(grbl, grbl_command)
|
||
|
|
||
|
|
||
|
def terminalWrite(): # Holt Zeichenstring von Editfeld und sendet es
|
||
|
grbl_command = terminal.get()
|
||
|
# print(grbl_command)
|
||
|
|
||
|
grbl_gcode_send.send_gcode(grbl, grbl_command)
|
||
|
|
||
|
|
||
|
def infoScreen(data): # Anzeigecanvas für GRBL Rückmeldungen
|
||
|
global i
|
||
|
terminalFrame = Frame(terminal_recv, bg='white')
|
||
|
terminal_recv.create_window(10, i, window=terminalFrame, anchor='nw')
|
||
|
Label(terminalFrame, text=data, font=('Calibri', 10), bg='white', fg='black').pack()
|
||
|
i += 22
|
||
|
if i >= 400:
|
||
|
i = 10
|
||
|
terminal_recv.delete("all")
|
||
|
|
||
|
|
||
|
def openGCODE(): # Dialog zur Gcode Auswahl und öffnen der Datei als GCODE Objekt
|
||
|
global gcode_to_stream
|
||
|
filetypes = (('GCODE', '*.nc'), ('All files', '*.*'))
|
||
|
GCODE = fd.askopenfile(title='Open a file', initialdir='/home/thomas/Nextcloud/CAM/', filetypes=filetypes)
|
||
|
|
||
|
if GCODE != 0:
|
||
|
fopen.config(bg=loaded)
|
||
|
extracted = extract_GCODE(GCODE)
|
||
|
draw_GCODE(extracted)
|
||
|
gcode_to_stream = GCODE
|
||
|
|
||
|
else:
|
||
|
fopen.config(bg='grey')
|
||
|
|
||
|
# build_xy = findEnvelope() #Aufruf PLatz im Bauraum
|
||
|
# mill_table.create_rectangle(build_xy[0],build_xy[1], fill = 'blue', stipple = 'gray75') # Zeichnen des Objekts im Bauraum
|
||
|
|
||
|
|
||
|
def extract_GCODE(gcode: list): # Aufschlüsseln der enthaltenen Koordinaten in ein per Schlüssel zugängiges Dictionary
|
||
|
|
||
|
list_dict_GCODE = []
|
||
|
for line in gcode:
|
||
|
l = line.split() # Elemente trennen und in Liste konvertieren
|
||
|
for i in range(0, len(l)):
|
||
|
# print (l)
|
||
|
if 'G' in l[i]:
|
||
|
dict_GCODE['G'] = l[i].replace('G', '') # Wert einfügen und gleichzeitig G CODE befehl entfernen
|
||
|
if 'X' in l[i]:
|
||
|
dict_GCODE['X'] = l[i].replace('X', '')
|
||
|
if 'Y' in l[i]:
|
||
|
dict_GCODE['Y'] = l[i].replace('Y', '')
|
||
|
if 'Z' in l[i]:
|
||
|
dict_GCODE['Z'] = l[i].replace('Z', '')
|
||
|
if 'I' in l[i] and not 'ZMIN':
|
||
|
dict_GCODE['I'] = l[i].replace('I', '')
|
||
|
if 'J' in l[i]:
|
||
|
dict_GCODE['J'] = l[i].replace('J', '')
|
||
|
if 'F' in l[i] and not 'Fusion':
|
||
|
dict_GCODE['F'] = l[i].replace('F', '')
|
||
|
|
||
|
# print(dict_GCODE)
|
||
|
list_dict_GCODE.append(
|
||
|
dict_GCODE.copy()) # Copy notwendig da es sich nur um einen "Pointer" handelt der immer auf die zuletzt aktualisierte dict Zeile zeigt.
|
||
|
print(list_dict_GCODE)
|
||
|
|
||
|
return list_dict_GCODE
|
||
|
|
||
|
|
||
|
def draw_GCODE(glist): # Zeichnen des GCodes zur Beurteilung des Bauraums
|
||
|
|
||
|
for i in range(0, len(glist) - 1):
|
||
|
x_y_current = 50 + float(glist[i]['X']), 350 - float(glist[i]['Y'])
|
||
|
x_y_next = 50 + float(glist[i + 1]['X']), 350 - float(glist[i + 1]['Y'])
|
||
|
|
||
|
mill_table.create_line(x_y_current, x_y_next)
|
||
|
|
||
|
|
||
|
def writeToFileLog(log): # Log für Debugzwecke
|
||
|
with open("log.txt", 'a') as out:
|
||
|
out.write(log)
|
||
|
|
||
|
|
||
|
def displayPosition_request(grbl_pos):
|
||
|
if grbl != 0:
|
||
|
try:
|
||
|
position = str(grbl_pos)
|
||
|
# print (readbuffer)
|
||
|
|
||
|
position = position.replace('Idle|', ',')
|
||
|
position = position.replace('Run|', ',')
|
||
|
position = position.replace('WPos:', '')
|
||
|
position = position.replace('MPos:', '')
|
||
|
position = position.replace('>', ',')
|
||
|
position = position.replace('|', ',')
|
||
|
position.strip()
|
||
|
coordinates_list = position.split(',')
|
||
|
# print(coordinates_list)
|
||
|
show_ctrl_x.config(text=coordinates_list[1])
|
||
|
show_ctrl_y.config(text=coordinates_list[2])
|
||
|
show_ctrl_z.config(text=coordinates_list[3])
|
||
|
|
||
|
mill_table.create_line(coordinates_list[1], coordinates_list[2], coordinates_list[1],
|
||
|
coordinates_list[2] + 50, arrow=FIRST)
|
||
|
|
||
|
# show_ctrl_x_w.config(text = coordinates_list[4])
|
||
|
# show_ctrl_y_w.config(text = coordinates_list[5])
|
||
|
# show_ctrl_z_w.config(text = coordinates_list[6])
|
||
|
|
||
|
except:
|
||
|
pass
|
||
|
# print("Listerror")
|
||
|
|
||
|
|
||
|
else:
|
||
|
print("Serial Busy")
|
||
|
# root.after(1000,displayPosition)
|
||
|
|
||
|
|
||
|
def displayPosition():
|
||
|
global readbuffer
|
||
|
if grbl != 0:
|
||
|
try:
|
||
|
position = str(readbuffer[2])
|
||
|
# print (readbuffer)
|
||
|
|
||
|
position = position.replace('Idle|', ',')
|
||
|
position = position.replace('Run|', ',')
|
||
|
position = position.replace('WPos:', '')
|
||
|
position = position.replace('MPos:', '')
|
||
|
position = position.replace('>', ',')
|
||
|
position = position.replace('|', ',')
|
||
|
position.strip()
|
||
|
coordinates_list = position.split(',')
|
||
|
# print(coordinates_list)
|
||
|
show_ctrl_x.config(text=coordinates_list[1])
|
||
|
show_ctrl_y.config(text=coordinates_list[2])
|
||
|
show_ctrl_z.config(text=coordinates_list[3])
|
||
|
|
||
|
mill_table.create_line(coordinates_list[1], coordinates_list[2], coordinates_list[1] + 10,
|
||
|
coordinates_list[2] + 20)
|
||
|
mill_table.create_line(coordinates_list[1], coordinates_list[2], coordinates_list[1] - 10,
|
||
|
coordinates_list[2] + 20)
|
||
|
mill_table.create_line(coordinates_list[1] - 10, coordinates_list[2] + 20, coordinates_list[1] + 10,
|
||
|
coordinates_list[2] + 20)
|
||
|
# show_ctrl_x_w.config(text = coordinates_list[4])
|
||
|
# show_ctrl_y_w.config(text = coordinates_list[5])
|
||
|
# show_ctrl_z_w.config(text = coordinates_list[6])
|
||
|
|
||
|
except:
|
||
|
pass
|
||
|
# print("Listerror")
|
||
|
|
||
|
else:
|
||
|
print("Serial Busy")
|
||
|
# root.after(1000,displayPosition)
|
||
|
|
||
|
|
||
|
def grblWrite():
|
||
|
if gcode_to_stream != None:
|
||
|
print("Stream", gcode_to_stream)
|
||
|
grbl_gcode_send.send_gcode(grbl, gcode_to_stream)
|
||
|
|
||
|
# fdbk = grbl_gcode_send.send_gcode(grbl, line)
|
||
|
# print(fdbk)
|
||
|
grbl_gcode_send.wait_for_buffer_empty()
|
||
|
|
||
|
|
||
|
def grblClose():
|
||
|
# Close file and serial port
|
||
|
# f.close()
|
||
|
try:
|
||
|
grbl.close()
|
||
|
print("closed")
|
||
|
connect_ser.config(bg='grey')
|
||
|
except:
|
||
|
print("Connection still open")
|