#
# charlie.mic.45.py
#
# plot microphone audio, zero crossings, zero, magnitude,
# and min/max sample values.
#

from Tkinter import *
import serial

NX = 190
NY = 500
WIDTH = 3*NX
HEIGHT = NY
nloop = 190
nstart = 10
path = []
samples = []

def idle(parent,canvas):
   global path, samples
   #
   # idle routine
   #
   # look for framing
   #
   byte2 = 0
   byte3 = 0
   byte4 = 0
   while 1:
      byte1 = byte2
      byte2 = byte3
      byte3 = byte4
      byte4 = ord(ser.read())
      if ((byte1 == 1) & (byte2 == 2) & (byte3 == 3) & (byte4 == 4)):
         break
   path = []
   samples = []
   # 
   # get zero crossing count
   #
   zero_crossings = ord(ser.read())
   #
   # get magnitude sum
   #
   lo = ord(ser.read())
   hi = ord(ser.read())
   magnitude = (lo + 256 * hi) / float(1 << 16)
   #
   # get "zero" definition
   #
   lo = ord(ser.read())
   hi = ord(ser.read())
   zero = (lo + 256 * hi) / 1024.0
   #
   # get samples
   #
   for i in range(nstart):
      lo = ord(ser.read())
      hi = ord(ser.read())
   for i in range(nloop):
      lo = ord(ser.read())
      hi = ord(ser.read())
      reading = 256*hi + lo
      value = NY*(1.0-reading/1024.0)
      path.append(3*i)
      path.append(value)
      samples.append(reading)

   canvas.delete("zc")
   zc_radius = WIDTH/2 * zero_crossings / 255.
   canvas.create_oval(WIDTH/2 - zc_radius, HEIGHT/2 - zc_radius, WIDTH/2 + zc_radius, HEIGHT/2 + zc_radius, tag="zc", fill="#FF%(lo)02x%(lo)02x" % {'lo': (1 - magnitude) * 255})

   canvas.delete("path")
   canvas.create_line(path,tag="path",width=3,fill="#00b000")
   canvas.delete("zero")
   canvas.create_line(0, HEIGHT/2, 20, (1 - zero) * HEIGHT, WIDTH, (1 - zero) * HEIGHT, 
                      fill="#000000", tag="zero")
   canvas.delete("max")
   max_h = (1 - max(samples) / 1024.) * HEIGHT
   canvas.create_line(0, 0, 20, max_h, WIDTH, max_h, tag="max", fill="#aaccaa")
   canvas.delete("min")
   min_h = (1 - min(samples[20:]) / 1024.) * HEIGHT
   canvas.create_line(0, HEIGHT, 20, min_h, WIDTH, min_h, tag="min", fill="#aaccaa")

   parent.after_idle(idle,parent,canvas)

#
# open serial port
#
ser = serial.Serial('/dev/ttyS0',115200)
#ser = serial.Serial('/dev/ttyUSB0',115200)
#ser.setDTR()
#
# start plotting
#
root = Tk()
root.title('hello.mic.45.py')
root.bind('q','exit')
canvas = Canvas(root, width=WIDTH, height=HEIGHT, background='white')
canvas.pack()
root.after(100,idle,root,canvas)
root.mainloop()
