# Reads and plots data from three channels of Phoenix, for 'maxtime' seconds.
# Uses draw.py

from Tkinter import *
import phm, draw, time, sys

NUMCHANS = 1		# Change number of channels if you like

WIDTH  = 600   # width of drawing canvas
HEIGHT = 150   # height    
datahistory = []       # store data      
data  = [ [],[],[] ]
dispobjects = [] 	# Objects of class display
running = False
starts  = [0,0,0]      # starting times for three channels
maxvolts = 5000.0
timegap = 5           # minimum msecs between reads
maxtime = 10.0	       # Total duration of the run in seconds

def update():	# Called periodically by the Tk toolkit
	global data, running, timegap, ph, NUMCHANS
	if running == False:
		return
	for ch in range(NUMCHANS):
		if NUMCHANS > 1 :	  # save some time
			ph.select_adc(ch)
		res = ph.get_voltage()
		x = res[0] - starts[ch]
		y = res[1]
		data[ch].append((x,y))
		if len(data[ch]) > 1:
			dispobjects[ch].delete_lines()
			dispobjects[ch].line(data[ch], 'black')
	if x <= maxtime:	# remove this condition to stop only by the STOP Button
		root.after(timegap, update)

def save():
	global data, running, filename
	s = e1.get()
	print s
	if s == '':
		s = filename
	f = open(s, 'w')
	for ch in range(NUMCHANS):
		for item in data[ch]:
			f.write('%5.3f  %5.0f\n'%(item[0], item[1]))
		f.write('\n')
	f.close()
	print 'Data saved to file ', s

def clear():
	global data, dispobjects, running
	if running == True:
		return
	for ch in range(NUMCHANS):
		data[ch] = []
		dispobjects[ch].delete_lines()

def start():
	global data, running, starts, timegap
	running = True
	s = time.time()  # time stamp
	starts[0] = starts[1] = starts[2] = s
	data  = [ [],[],[] ]
	root.after(timegap, update)

def stop():
	global running
	running = False

def setduration(self):
	global maxtime
	maxtime = Scale.get()
	for ch in range(NUMCHANS):
		dispobjects[ch].delete_lines()
		dispobjects[ch].setWorld(0, 0, maxtime, maxvolts)
		dispobjects[ch].mark_axes('Seconds','mV')
		if len(data[ch]) > 1:
			#dispobjects[ch].delete_lines()
			dispobjects[ch].line(data[ch], 'black')
def quit():
	sys.exit()

ph = phm.phm()
ph.set_adc_size(2)
ph.select_adc(0)    # Use this is NUMCHANS = 1

root = Tk()
Canvas(root, width = WIDTH, height = 5).pack(side=TOP)  # Some space at the top
for k in range(NUMCHANS):					
	w = draw.disp(root, width=WIDTH, height=HEIGHT)	# make plot objects using draw.disp
	w.setWorld(0, 0, maxtime, maxvolts)
	w.mark_axes('Seconds','mV')
	dispobjects.append(w)

dispobjects[0].mark_axes('milli Seconds','mV')

cf = Frame(root, width = WIDTH, height = 10)
cf.pack(side=TOP,  fill = BOTH, expand = 1)
b1 = Button(cf, text = 'START', command = start)
b1.pack(side = LEFT, anchor = N)
b2 = Button(cf, text = 'STOP', command = stop)
b2.pack(side = LEFT, anchor = N)
b3 = Button(cf, text = 'SAVE to', command = save)
b3.pack(side = LEFT, anchor = N)
filename = StringVar()
e1 =Entry(cf, width=15, bg = 'white', textvariable = filename)
filename.set('logger.dat')
e1.pack(side = LEFT)

Scale = Scale(cf,command = setduration, orient=HORIZONTAL, length=200,\
		from_ = 10,to=1000, resolution=10)
Scale.pack(side=LEFT)

b4 = Button(cf, text = 'CLEAR', command = clear)
b4.pack(side = LEFT, anchor = N)
b5 = Button(cf, text = 'QUIT', command = quit)
b5.pack(side = RIGHT, anchor = N)

root.title('Phoenix Based Data Logger')
root.mainloop()

