fluepdot-scripts/recharge.py

91 lines
2.7 KiB
Python
Raw Permalink Normal View History

"""
Script for the flipdot recharge party animation
"""
# requires: python-fluepdot, python_dotenv, pillow
import os
from time import sleep
from dotenv import load_dotenv
from fluepdot import Fluepdot, Mode
logo = """
X
XXXXXXXXXXXX XX XXXXXXXXXXX
XX XXX XX
X XXX X
X XXXX X
X XXXXXXXX XX
X XXXXXXXX XX
X XXXX X
X XXX X
XX XXX XX
XXXXXXXXXXX XX XXXXXXXXXXXX
X
"""
# convert text to framebuffer format
def textToFramebuffer(text: str, x: int = 0, y: int = 0, fontname: str = "DejaVuSans.ttf", size: int = 14) -> str:
from PIL import Image, ImageFont, ImageDraw
font = ImageFont.truetype(fontname, size)
_, _, tw, th = font.getbbox(text)
while th >= 16:
print(th)
size -= 1
font = ImageFont.truetype(fontname, size)
_, _, tw, th = font.getbbox(text)
img = Image.new("1", (tw, 16), 0)
draw = ImageDraw.Draw(img)
draw.text((0, 0), text=text, font=font, fill=1)
framebuffer: str = ""
for y in range(img.height):
for x in range(img.width):
framebuffer += "X" if img.getpixel((x, y)) == 1 else " "
framebuffer += "\n"
return framebuffer
def scrl_frm(frame, loop: bool or int = False) -> None:
def _extend_frame(line: str) -> str:
return line + (" " * loop) + line[0:115]
def _pad_frame(line: str) -> str:
pad = " " * 115
return pad + line + pad
frame = frame.split("\n")
length = len(frame[0]) + loop if type(loop) == int else len(frame[0]) + 115
if type(loop) == int:
frame = list(map(_extend_frame, frame))
else:
frame = list(map(_pad_frame, frame))
_run_once = True
while loop or type(loop) == int or _run_once:
_run_once = False
for i in range(0, length, 2):
print(".\n".join(l[i:i + 115] for l in frame))
sleep(.1)
if __name__ == "__main__":
load_dotenv()
hostname = os.getenv("DOTS_HOST")
frame = textToFramebuffer("recharge! flipdot e.V.", fontname="DejaVuSans.ttf")
fd = Fluepdot(f"http://{hostname}")
fd.set_mode(Mode.DIFFERENTIAL)
logoarr = logo.split("\n")
nframe = ""
for y in range(len(logoarr)):
nframe += logoarr[y] + frame.split("\n")[y] + "\n"
nframe = nframe[:-1]
print(nframe)
fd.post_scroll_frame_raw(nframe, loop=2)
#scrl_frm(nframe, loop=2)