forked from matesh/oes_matrix_challenge
-
Notifications
You must be signed in to change notification settings - Fork 0
/
TerminalRenderer.py
62 lines (52 loc) · 2.25 KB
/
TerminalRenderer.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
import multiprocessing
from renderer_common import LED_COUNT, CLEAR_FRAME_INDEX, ROWS, COLUMNS
from traceback import print_exc
import os
class TerminalRenderer(multiprocessing.Process):
def __init__(self, render_pipe, stop_signal, stopped_signal, render_delay=None):
super(TerminalRenderer, self).__init__()
self.render_pipe = render_pipe
self.stop_signal = stop_signal
self.stopped_signal = stopped_signal
self.brightness = 255
self.unsuccessful_renders = 0
self.led_strip = [0] * LED_COUNT
def run(self):
try:
while not self.stop_signal.is_set():
if self.render_pipe.poll(0.05):
frame = self.render_pipe.recv()
for pixel in frame:
if pixel.index == CLEAR_FRAME_INDEX:
self.led_strip = [0] * LED_COUNT
else:
if pixel.colour.green == 0x0 and pixel.colour.red == 0x0 and pixel.colour.blue == 0x0:
self.led_strip[pixel.index] = 0
else:
self.led_strip[pixel.index] = 1
self.print_matrix()
except KeyboardInterrupt:
pass
except Exception:
print("Exception in renderer")
print_exc()
finally:
print("Terminating renderer")
self.stopped_signal.set()
def print_matrix(self):
os.system('cls' if os.name == 'nt' else 'clear')
frame = ""
for row in range(0, ROWS):
line = "{:2}|".format(row)
for pixel in range(row*COLUMNS, (row+1)*COLUMNS):
line += '*|' if self.led_strip[pixel] == 1 else " |"
frame += line + os.linesep
print(frame)
def initialise_renderer(render_delay=None):
render_pipe_out, render_pipe_in = multiprocessing.Pipe(False)
terminate_renderer = multiprocessing.Event()
renderer_terminated = multiprocessing.Event()
renderer = TerminalRenderer(render_pipe_out, terminate_renderer, renderer_terminated, render_delay=None)
renderer.daemon = True
renderer.start()
return renderer, render_pipe_in, terminate_renderer, renderer_terminated