crashtest-r0ket/tools/game/bong/integrator-reader.py

139 lines
3.2 KiB
Python

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()