forked from adcomp/piface-python-websocket-server
-
Notifications
You must be signed in to change notification settings - Fork 0
/
server.py
73 lines (55 loc) · 1.55 KB
/
server.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
#!/usr/bin/python
###
# Python WebSocket Server for Raspberry Pi
# PiFace web control
# by David Art <[email protected]>
###
import tornado.httpserver
import tornado.websocket
import tornado.ioloop
import tornado.web
import datetime
import json
import piface.pfio as pfio
pfio.init()
last_data = None
class WSHandler(tornado.websocket.WebSocketHandler):
def open(self):
self.connected = True
print 'new connection'
self.timeout_loop()
def on_message(self, message):
global last_data
# print '> %s' % message
pin = int(message)
state = int(last_data['out'][pin])
# invert (toggle)
state = not bool(state)
pfio.digital_write(pin, state)
def on_close(self):
self.connected = False
print 'connection closed'
def timeout_loop(self):
# read PiFace input/output state
global last_data
r_input = '{0:08b}'.format(pfio.read_input())
r_output = '{0:08b}'.format(pfio.read_output())
data = {"in": [], "out": []}
for i in range(8):
data['in'].append(r_input[7-i])
data['out'].append(r_output[7-i])
if data != last_data:
self.write_message(json.dumps(data))
last_data = data
# here come the magic part .. loop
if self.connected:
tornado.ioloop.IOLoop.instance().add_timeout(datetime.timedelta(seconds=.5), self.timeout_loop)
application = tornado.web.Application([
(r'/piface', WSHandler),
])
if __name__ == "__main__":
http_server = tornado.httpserver.HTTPServer(application)
http_server.listen(8888)
print 'Raspberry Pi - PiFace'
print 'WebSocket Server start ..'
tornado.ioloop.IOLoop.instance().start()