2 from __future__
import with_statement
3 from projector
import DummyProjector
4 from blinken_handler
import BlinkenHandler
5 from control_handler
import ControlHandler
6 from my_threading
import Thread
, schedule
, ThreadingMixIn
, Lock
7 from SocketServer
import TCPServer
9 __all__
= ['BlinkenServer']
11 class Server(ThreadingMixIn
, TCPServer
):
12 allow_reuse_address
= True
14 class BlinkenServer(Server
):
16 current
= DummyProjector()
22 self
._force
_next
= False
23 self
._blinken
= Server(('', self
.blinken_port
), BlinkenHandler
)
24 self
._blinken
.connections
= {}
25 self
._blinken
.lock
= Lock()
26 self
._blinken
.close_request
= lambda request
: None
28 Server
.__init
__(self
, ('', self
.control_port
), ControlHandler
)
30 self
._idles
= {'dummy' : DummyProjector()}
33 Thread(self
._serve
_nodes
)()
34 Thread(self
._blinken
.serve_forever
)()
35 Thread(self
.serve_forever
)()
37 def set_projector(self
, projector
):
38 self
._force
_next
= True
39 self
._next
.insert(0, projector
)
41 def enqueue_projector(self
, projector
):
42 self
._next
.append(projector
)
44 def _projectors(self
):
48 self
._is
_idling
= True
49 yield random
.choice(self
._idles
.values())
51 self
._is
_idling
= False
52 proj
= self
.next
.pop(0)
55 def _serve_nodes(self
):
56 for projector
in self
._projectors
():
57 for frame
in projector
:
59 with self
._blinken
.lock
:
60 for pixel
, socket
in self
._blinken
.connections
.iteritems():
62 socket
.send(("on" if pixel
in frame
else "off") + "\r\n")
64 to_clean
.append(pixel
)
67 del self
._blinken
.connections
[i
]
69 if self
._force
_next
or self
._next
and self
._is
_idling
:
70 self
._force
_next
= False
76 if __name__
== '__main__':
77 server
= BlinkenServer()