-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathapp.py
94 lines (70 loc) · 2.08 KB
/
app.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
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
from os import chdir, getpgid, killpg, setsid
from pathlib import Path
from shlex import split
from signal import SIGTERM
from subprocess import Popen
from flask import Flask, jsonify
app = Flask(__name__)
anim_proc = None
goal_proc = None
ROOT_PATH = Path(".").absolute()
UTILS_PATH = Path("rpi-rgb-led-matrix/utils").absolute()
LED_CMD = "./led-image-viewer"
LED_ARGS = " ".join(
[
"--led-chain=8",
"--led-rows=32",
"--led-cols=32",
"--led-parallel=1",
"--led-gpio-mapping=adafruit-hat",
"--led-brightness=75",
"--led-pwm-bits=5",
"--led-no-hardware-pulse",
"--led-slowdown-gpio=4",
]
)
ANIM_IMGS = " ".join(
[
"../../gifs/alexa_ranking.gif",
"../../gifs/bongacams_scroller_2.gif",
"../../gifs/Chaturbate_visitors.gif",
"../../gifs/LiveJasmin_worth.gif",
]
)
ANIM_CMD = split(f"{LED_CMD} {LED_ARGS} -f -s {ANIM_IMGS}")
GOAL_LENGTH = 20
GOAL_IMG = "../../gifs/Goal_Reached.gif"
GOAL_CMD = split(f"{LED_CMD} {LED_ARGS} -t {GOAL_LENGTH} {GOAL_IMG}")
def kill_process(process):
killpg(getpgid(process.pid), SIGTERM)
def run_led(cmd):
chdir(UTILS_PATH)
process = Popen(cmd, preexec_fn=setsid)
chdir(ROOT_PATH)
return process
@app.route("/ok")
def isup():
return jsonify(success=True)
@app.route("/")
def home():
global anim_proc
global goal_proc
# Note(decentral1se): Return early if we're already showing the message
if goal_proc and goal_proc.poll() is None:
return jsonify(success=True)
if anim_proc:
kill_process(anim_proc)
goal_proc = run_led(GOAL_CMD)
# Note(decentral1se): opportunistically re-run the animations which take
# much longer to load so as to arrange them to show in a timely fashion
anim_proc = run_led(ANIM_CMD)
return jsonify(success=True)
if __name__ == "__main__":
anim_proc = run_led(ANIM_CMD)
try:
app.run(debug=False, host="0.0.0.0")
finally:
if anim_proc:
kill_process(anim_proc)
if goal_proc:
kill_process(goal_proc)