import time
import Queue
import tornado.escape
import tornado.ioloop
import tornado.options
import tornado.web
import tornado.websocket
import os.path
import logging
import threading
import socket
import time

from tornado.options import define, options

define("port", default=8888, help="run on the given port", type=int)

pong=None
left=0.0
right=0.0
cntr=0
cntl=0
info={}
idle={}

def sendpos():
    global right, left
    global cntr, cntl
    global info
    for (id,(b,t,r)) in info.items():
	if(t+5<time.time()):
#	    print "time=%s"%(time.time())
	    del info[id]
    sumr=0.0
    suml=0.0
    cntr=0.0
    cntl=0.0
    for (id,(b,t,r)) in info.items():
        if b != 0:
            idle[id]=time.time()
        if id in idle and idle[id]+30<time.time():
            print "idle-ignoring %s"%(id)
        else:
            if r==1:
                cntr+=1
            else:
                cntl+=1
    	if b&1==1:
	    if r==1:
		sumr-=1
	    else:
		suml-=1
    	if b&2==2:
	    if r==1:
		sumr+=1
	    else:
		suml+=1
#	print "summing: suml=%s cntl=%s sumr=%s cntr=%s"%(suml,cntl,sumr,cntr)
    if cntr==0:
        right=0
    else:
        right=sumr/cntr
    if cntl==0:
        left=0
    else:
        left=suml/cntl
    sstr="{ \"right\": %s, \"cntr\": %s , \"cntl\": %s, \"left\": %s }"%(right,cntr,cntl,left)
    if pong:
        pong.write_message(sstr)
#    	print sstr
    threading.Timer(.1,sendpos).start()

sendpos()

def workPacket(data, addr):
    global right, left
    global cntr, cntl
    global reid
    global r0id
    global button
    global info
#    print "new packet:", list(data), addr
    reid=ord(data[4])*256 + ord(data[5])
    r0id=ord(data[19])*256*256*256 + ord(data[20])*256*256+ord(data[21])*256+ord(data[22])
    button=ord(data[27])
    rl=1
    if reid == 1123:
    	rl=2
    info[r0id]=(button,time.time(),rl)
    print "added rl=%s r0=%s bu=%s"%(rl,r0id,button)

def readerThread():
    sock = socket.socket( socket.AF_INET, # Internet
                           socket.SOCK_DGRAM ) # UDP
    sock.bind(("0.0.0.0", 2342))

    while 1:
        data, addr = sock.recvfrom(1024)
        workPacket(data, addr)
        
reader = threading.Thread(target = readerThread)
reader.daemon = True

reader.start()

class Application(tornado.web.Application):
    def __init__(self):
        handlers = [
            (r"/data", DataSocketHandler),
        ]
        settings = dict(
            cookie_secret="43oETzKXQAGaYdkL5gEmGeJJFuYh7EQnp2XdTP1o/Vo=",
            template_path=os.path.join(os.path.dirname(__file__), "templates"),
            static_path=os.path.join(os.path.dirname(__file__), "static"),
            xsrf_cookies=True,
            autoescape=None,
        )
        tornado.web.Application.__init__(self, handlers, **settings)

class DataSocketHandler(tornado.websocket.WebSocketHandler):
    waiters = set()
    def open(self):
        global pong
        print "WebSocket: Open"
        DataSocketHandler.waiters.add(self)
        pong=self

    def on_close(self):
        print "WebSocket: Close"
        DataSocketHandler.waiters.remove(self)

    def on_message(self, message):
        print "Got message: ",message

tornado.options.parse_command_line()
app = Application()
app.listen(options.port,'127.0.0.1')
tornado.ioloop.IOLoop.instance().start()