139 lines
3.2 KiB
Python
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()
|