Skip to content
Snippets Groups Projects
Forked from card10 / firmware
1261 commits behind the upstream repository.
__init__.py 4.36 KiB
"""
Improvement ideas
- animations
    - dvd
    - rainbow
    - led control
    - fade effekt
- led nick writing
"""

import utime
import display
import leds
import ledfx
import buttons
import light_sensor
import ujson
import os

FILENAME = 'nickname.txt'
FILENAME_ADV = 'nickname.json'
ANIM_TYPES = ['none', 'led', 'fade']


def render_error(err1, err2):
    with display.open() as disp:
        disp.clear()
        disp.print(err1, posx=80 - round(len(err1) / 2 * 14), posy=18)
        disp.print(err2, posx=80 - round(len(err2) / 2 * 14), posy=42)
        disp.update()
        disp.close()


def render_nickname(title, sub, fg, bg, fg_sub, bg_sub, main_bg):
    anim = 'led'
    posy = 30
    if sub != '':
        posy = 18
    r = 255
    g = 0
    b = 0
    while True:
        dark = 0
        if light_sensor.get_reading() < 30:
            dark = 1
        r_fg_color = fg[dark]
        r_bg_color = bg[dark]
        r_fg_sub_color = fg_sub[dark]
        r_bg_sub_color = bg_sub[dark]
        r_bg = main_bg[dark]
        if anim == 'fade':
            if r > 0 and b == 0:
                r = r - 1
                g = g + 1
            if g > 0 and r == 0:
                g = g - 1
                b = b + 1
            if b > 0 and g == 0:
                r = r + 1
                b = b - 1
            r_bg = [r, g, b]
        if anim == 'led':
            for i in range(0, 11):
                leds.prep(i, r_bg)
            leds.update()
            leds.dim_top(3)
            leds.set_rocket(0, 15)
            leds.set_rocket(1, 15)
            leds.set_rocket(2, 15)
        if anim == 'none':
            leds.clear()
            leds.set_rocket(0, 0)
            leds.set_rocket(1, 0)
            leds.set_rocket(2, 0)
        with display.open() as disp:
            disp.rect(0, 0, 160, 80, col=r_bg, filled=True)
            disp.print(title, fg=r_fg_color, bg=r_bg_color, posx=80 - round(len(title) / 2 * 14), posy=posy)
            if sub != '':
                disp.print(sub, fg=r_fg_sub_color, bg=r_bg_sub_color, posx=80 - round(len(sub) / 2 * 14), posy=42)
            disp.update()
            disp.close()
        pressed = buttons.read(
            buttons.BOTTOM_LEFT | buttons.BOTTOM_RIGHT
        )
        if pressed & buttons.BOTTOM_LEFT != 0:
            anim = ANIM_TYPES[1]
        if pressed & buttons.BOTTOM_RIGHT != 0:
            anim = ANIM_TYPES[0]
        utime.sleep(0.3)


def get_key(json, key, default):
    try:
        return json[key]
    except KeyError:
        return default


leds.clear()
with display.open() as disp:
    disp.clear().update()
    disp.close()

if FILENAME_ADV in os.listdir("."):
    f = open(FILENAME_ADV, 'r')
    try:
        c = ujson.loads(f.read())
        f.close()
        # parse config
        nick = get_key(c, 'nickname', 'no nick')
        sub = get_key(c, 'subtitle', '')
        # daytime values
        background = get_key(c, 'background', [0, 0, 0])
        fg_color = get_key(c, 'fg_color', [255, 255, 255])
        bg_color = get_key(c, 'bg_color', background)
        fg_sub_color = get_key(c, 'fg_sub_color', [255, 255, 255])
        bg_sub_color = get_key(c, 'bg_sub_color', background)
        # nighttime values
        background_night = get_key(c, 'background_night', [0, 0, 0])
        fg_color_night = get_key(c, 'fg_color_night', [255, 255, 255])
        bg_color_night = get_key(c, 'bg_color_night', background_night)
        fg_sub_color_night = get_key(c, 'fg_sub_color_night', [255, 255, 255])
        bg_sub_color_night = get_key(c, 'bg_sub_color_night', background_night)
        # render nickname
        render_nickname(nick, sub, (fg_color, fg_color_night), (bg_color, bg_color_night),
                        (fg_sub_color, fg_sub_color_night), (bg_sub_color, bg_sub_color_night),
                        (background, background_night))
    except ValueError:
        render_error('invalid', 'json')
else:
    if FILENAME not in os.listdir("."):
        render_error('file not', 'found')
    else:
        f = open(FILENAME, 'r')
        nick = f.read()
        f.close()
        if len(nick) > 11:
            render_error('name too', 'long')
        if len(nick) < 1:
            render_error('nick file', 'empty')
        else:
            render_nickname(nick, '', ([255, 255, 255], [255, 255, 255]), ([0, 0, 0], [0, 0, 0]),
                            ([255, 255, 255], [255, 255, 255]), ([0, 0, 0], [0, 0, 0]), ([0, 0, 0], [0, 0, 0]))