2 from __future__
import with_statement
3 from blinken_handler
import BlinkenHandler
4 from control_handler
import ControlHandler
5 from my_threading
import Thread
, schedule
, ThreadingMixIn
, Lock
, sleep
6 from SocketServer
import TCPServer
7 from socket
import error
9 __all__
= ['BlinkenServer']
11 def dummy_projector():
16 class Server(ThreadingMixIn
, TCPServer
):
17 allow_reuse_address
= True
19 class BlinkenServer(Server
):
26 movies
= {'dummy': dummy_projector()}
29 self
._blinken
= Server(('', self
.blinken_port
), BlinkenHandler
)
30 self
._blinken
.connections
= {}
31 self
._blinken
.lock
= Lock()
33 Server
.__init
__(self
, ('', self
.control_port
), ControlHandler
)
35 Thread(self
._serve
_nodes
)()
36 Thread(self
._blinken
.serve_forever
)()
37 Thread(self
.serve_forever
)()
39 def set_projector(self
, projector
):
40 self
._force
_next
= True
41 self
._queue
.insert(0, projector
)
43 def enqueue_projector(self
, projector
):
44 self
._queue
.append(projector
)
46 def _projectors(self
):
50 self
._is
_idling
= True
51 yield self
.movies
[random
.choice(self
.idles
)]
53 self
._is
_idling
= False
54 yield self
._queue
.pop(0)
56 def _serve_nodes(self
):
57 val
= { True: 'on', False: 'off' }
58 for projector
in self
._projectors
():
59 for frame
in projector
:
61 with self
._blinken
.lock
:
62 for pixel
, sock
in self
._blinken
.connections
.iteritems():
64 sock
.send(val
[pixel
in frame
] + "\r\n")
66 to_clean
.append(pixel
)
69 del self
._blinken
.connections
[i
]
71 if self
._force
_next
or self
._queue
and self
._is
_idling
:
72 self
._force
_next
= False
78 if __name__
== '__main__':
80 from optparse
import OptionParser
81 import cPickle
as pickle
85 opts
.add_option('-f', '--file', dest
="filename")
87 server
= BlinkenServer()