#
# hello.MPU-6050.py
#
# MPU-6050 IMU hello-world
#
# Neil Gershenfeld 10/20/24
#
# This work may be reproduced, modified, distributed,
# performed, and displayed for any purpose, but must
# acknowledge this project. Copyright is retained and
# must be preserved. The work is provided as is; no
# warranty is provided, and users accept all liability.
#

from tkinter import *
import serial,sys

WINDOW = 1000 # window size

def idle(parent,canvas):
   roll = pitch= yaw = ax = ay = az = 0
   #
   # read data
   #
   s = ser.readline().decode('utf-8')
   try:
      yaw = float(s.split(',')[0])
      pitch = float(s.split(',')[1])
      roll = float(s.split(',')[2])
      ax = float(s.split(',')[3])
      ay = float(s.split(',')[4])
      az = float(s.split(',')[5])
   except:
      pass
   #
   #
   # plot
   #
   canvas.itemconfigure("roll",text=f"roll: {roll:.1f}")
   x = int(.3*WINDOW + (.9-.3)*WINDOW*(0.5+0.5*roll/180))
   canvas.coords('roll1',.3*WINDOW,.05*WINDOW,x,.2*WINDOW)
   canvas.coords('roll2',x,.05*WINDOW,.9*WINDOW,.2*WINDOW)
   canvas.itemconfigure("pitch",text=f"pitch: {pitch:.1f}")
   x = int(.3*WINDOW + (.9-.3)*WINDOW*(0.5+0.5*pitch/180))
   canvas.coords('pitch1',.3*WINDOW,.25*WINDOW,x,.4*WINDOW)
   canvas.coords('pitch2',x,.25*WINDOW,.9*WINDOW,.4*WINDOW)
   canvas.itemconfigure("yaw",text=f"yaw: {yaw:.1f}")
   x = int(.3*WINDOW + (.9-.3)*WINDOW*(0.5+0.5*yaw/180))
   canvas.coords('yaw1',.3*WINDOW,.45*WINDOW,x,.6*WINDOW)
   canvas.coords('yaw2',x,.45*WINDOW,.9*WINDOW,.6*WINDOW)
   canvas.itemconfigure("ax",text=f"ax: {ax:.0f}")
   x = int(.3*WINDOW + (.9-.3)*WINDOW*(0.5+0.5*ax/12000))
   canvas.coords('ax1',.3*WINDOW,.65*WINDOW,x,.8*WINDOW)
   canvas.coords('ax2',x,.65*WINDOW,.9*WINDOW,.8*WINDOW)
   canvas.itemconfigure("ay",text=f"ay: {ay:.0f}")
   x = int(.3*WINDOW + (.9-.3)*WINDOW*(0.5+0.5*ay/12000))
   canvas.coords('ay1',.3*WINDOW,.85*WINDOW,x,1*WINDOW)
   canvas.coords('ay2',x,.85*WINDOW,.9*WINDOW,1*WINDOW)
   canvas.itemconfigure("az",text=f"az: {az:.0f}")
   x = int(.3*WINDOW + (.9-.3)*WINDOW*(0.5+0.5*az/12000))
   canvas.coords('az1',.3*WINDOW,1.05*WINDOW,x,1.2*WINDOW)
   canvas.coords('az2',x,1.05*WINDOW,.9*WINDOW,1.2*WINDOW)
   #
   # update
   #
   canvas.update()
   parent.after_idle(idle,parent,canvas)

#
#  check command line arguments
#
if (len(sys.argv) != 2):
   print("command line: hello.MPU-6050.py serial_port")
   sys.exit()
port = sys.argv[1]
#
# open serial port
#
ser = serial.Serial(port,115200)
#
# set up GUI
#
root = Tk()
root.title('hello.MPU-6050.py (q to exit)')
root.bind('q','exit')
canvas = Canvas(root,width=WINDOW,height=1.25*WINDOW,background='white')
#
canvas.create_text(.025*WINDOW,.125*WINDOW,text="1",font=("Helvetica",28),tags="roll",fill="#0000b0",anchor=SW)
canvas.create_rectangle(.3*WINDOW,.05*WINDOW,.4*WINDOW,.2*WINDOW,tags='roll1', fill='#b00000')
canvas.create_rectangle(.4*WINDOW,.05*WINDOW,.9*WINDOW,.2*WINDOW,tags='roll2', fill='#0000b0')
#
canvas.create_text(.025*WINDOW,.325*WINDOW,text="1",font=("Helvetica",28),tags="pitch",fill="#0000b0",anchor=SW)
canvas.create_rectangle(.3*WINDOW,.25*WINDOW,.4*WINDOW,.4*WINDOW,tags='pitch1', fill='#b00000')
canvas.create_rectangle(.4*WINDOW,.25*WINDOW,.9*WINDOW,.4*WINDOW,tags='pitch2', fill='#0000b0')
#
canvas.create_text(.025*WINDOW,.525*WINDOW,text="1",font=("Helvetica",28),tags="yaw",fill="#0000b0",anchor=SW)
canvas.create_rectangle(.3*WINDOW,.45*WINDOW,.4*WINDOW,.6*WINDOW,tags='yaw1', fill='#b00000')
canvas.create_rectangle(.4*WINDOW,.45*WINDOW,.9*WINDOW,.6*WINDOW,tags='yaw2', fill='#0000b0')
#
canvas.create_text(.025*WINDOW,.725*WINDOW,text="1",font=("Helvetica",28),tags="ax",fill="#0000b0",anchor=SW)
canvas.create_rectangle(.3*WINDOW,.65*WINDOW,.4*WINDOW,.8*WINDOW,tags='ax1', fill='#b00000')
canvas.create_rectangle(.4*WINDOW,.65*WINDOW,.9*WINDOW,.8*WINDOW,tags='ax2', fill='#0000b0')
#
canvas.create_text(.025*WINDOW,.925*WINDOW,text="1",font=("Helvetica",28),tags="ay",fill="#0000b0",anchor=SW)
canvas.create_rectangle(.3*WINDOW,.85*WINDOW,.4*WINDOW,1*WINDOW,tags='ay1', fill='#b00000')
canvas.create_rectangle(.4*WINDOW,.85*WINDOW,.9*WINDOW,1*WINDOW,tags='ay2', fill='#0000b0')
#
canvas.create_text(.025*WINDOW,1.125*WINDOW,text="1",font=("Helvetica",28),tags="az",fill="#0000b0",anchor=SW)
canvas.create_rectangle(.3*WINDOW,1.05*WINDOW,.4*WINDOW,1.2*WINDOW,tags='az1', fill='#b00000')
canvas.create_rectangle(.4*WINDOW,1.05*WINDOW,.9*WINDOW,1.2*WINDOW,tags='az2', fill='#0000b0')
#
canvas.pack()
#
# start idle loop
#
root.after(100,idle,root,canvas)
root.mainloop()
