#!/usr/bin/python

"""
TK grapher for wattsup? meter, for openmoko phones
Copyright Troy Benjegerdes <hozer@hozed.org>
Licensed under the GNU GPLv2 or GPLv3
"""

data = [1,0]
datamin = [1,0]
datamax = [1,0]

import Tkinter as tk
import tkFont
import random
import serial
import pexpect
from common import getname

root = tk.Tk()
root.title("Power Consumption")

c_width = 480
#c1_height = 300
c1_height = 570
c2_height = 270
c2_samples = 300
width=1
#c2_samples = 
#width=5

#ser = serial.Serial('/dev/rfcomm0', 115200, timeout=2)
#ser.write('#L,W,3,E,0,1;')

rfcommdev = None
rfser = None
rfcomm = None

fontsize = 12
font = tkFont.Font(size=fontsize)

f = open(getname(), 'r')

def sendbt(new):
	global rfcommdev, rfser,  rfcomm
	if rfser:
		try:
			rfser.write(repr(new)+'\r\n')
		except OSError: # start over, client died
			rfser.close()
			rfcomm.close(force=True)
			rfcomm = None
			rfser = None
	elif rfcomm:	# no serial connection, check for listener
		try:
			rfcomm.expect('Connection from (.*) to (/dev.*)\r\nPress CTRL-C for hangup', timeout=0)
			rfser = serial.Serial(rfcomm.match.group(2), 115200, timeout=1)
		except pexpect.TIMEOUT:
			pass
		except serial.SerialException:
			print "Error opening port %s" % rfcomm.match.group(2)
	else:
		rfcomm = pexpect.spawn('rfcomm listen watts')

def getnew():
	global data, f
	new = []
	# get all new stuff
	lines = f.read()
	if (getname() != f.name):
		f.close()
		f = open(getname(), 'r')
		print "Opened new file %s" % f.name
		lines = lines + f.read()
	for l in lines.split():
		if (len(l) > 3 and l[0:4] == '#d,-'):
			ws = l.split(',')[3]
			new.append(int(ws))

	data = (data + new)[-c_width:]
	return new

def graph(data):
	m = max(data)
	
	c1.delete('all')
	for i in range(1, len(data) + 1):
		x = c_width - i
		y1 = c1_height
		y2 = c1_height - data[-i]*c1_height/m
		c1.create_line(x,y1,x,y2, fill="green")
		#c.create_rectangle(x*width,c1_height,x*width+width-1,
		#		c1_height-y*c1_height/m,fill="green",width=0)

	c1.create_text(10,fontsize*2, anchor=tk.SW, text="Max power: %0.1f W" %
			(m/10.0), font=font)
	c1.create_text(10,c1_height, anchor=tk.SW, text="0  Current power: %0.1f" %
			(data[-1]/10.0), font=font)

def graph2(mind,maxd):
	m = max(maxd)
	c2.delete('all')
	for x in range(len(mind)):
		upper = c2_height - mind[x]*c2_height/m
		lower = c2_height - maxd[x]*c2_height/m
		if ((upper-lower) < 6):
			upper = upper + (6-(upper-lower))/2.0
			lower = lower - (6-(upper-lower))/2.0
		c2.create_line(x,upper,x,lower, fill="green")


 	print "mind:", mind
	print "maxd:" , maxd

def timer():
	new = getnew()
	sendbt(new)
	graph(data)
	root.after(4000, timer)


c1 = tk.Canvas(root, width=c_width, height=c1_height, bg='white')
c1.pack()
#c2 = tk.Canvas(root, width=c_width, height=c2_height, bg='white')
#c2.pack()

root.after(100, timer)
root.mainloop()
