""" Script for the flipdot recharge party animation """ # requires: python-fluepdot, python_dotenv 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.getsize(text) while th >= 16: print(th) size -= 1 font = ImageFont.truetype(fontname, size) tw, th = font.getsize(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)