Adafruit_Learning_System_Gu.../LCARS/code.py
2023-05-03 07:38:31 -07:00

136 lines
3.6 KiB
Python
Executable file

# SPDX-FileCopyrightText: 2023 John Park for Adafruit Industries
#
# SPDX-License-Identifier: MIT
# LCARS MatrixPortal Display
# LED brigthness code by Jan Goolsbey
import time
import os
import board
import displayio
from digitalio import DigitalInOut, Pull
from simpleio import map_range # For color brightness calculation
from adafruit_matrixportal.matrix import Matrix
from adafruit_debouncer import Debouncer
import supervisor
supervisor.runtime.autoreload = True
SPRITESHEET_FOLDER = "/bmps"
DEFAULT_FRAME_DURATION = 0.7 # 100ms
AUTO_ADVANCE_LOOPS = 3
bitmap = ""
brightness = 15 # ### Integer value from 0 to 15
# --- Display setup ---
matrix = Matrix(bit_depth=4, width=128, height=64)
sprite_group = displayio.Group()
matrix.display.show(sprite_group)
# --- Button setup ---
pin_down = DigitalInOut(board.BUTTON_DOWN)
pin_down.switch_to_input(pull=Pull.UP)
button_down = Debouncer(pin_down)
pin_up = DigitalInOut(board.BUTTON_UP)
pin_up.switch_to_input(pull=Pull.UP)
button_up = Debouncer(pin_up)
auto_advance = False
file_list = sorted(
[
f
for f in os.listdir(SPRITESHEET_FOLDER)
if (f.endswith(".bmp") and not f.startswith("."))
]
)
if len(file_list) == 0:
raise RuntimeError("No images found")
current_image = None
current_frame = 0
current_loop = 0
frame_count = 0
frame_duration = DEFAULT_FRAME_DURATION
def image_brightness(new_bright=0):
"""Calculate the white color brightness.
Returns a white RBG888 color value proportional to `new_bright`."""
# Scale brightness value
bright = int(map_range(new_bright, 0, 15, 0x00, 0xFF))
# Recombine and return a composite RGB888 value
return (bright << 16) + (bright << 8) + bright
def load_image():
"""
Load an image as a sprite
"""
# pylint: disable=global-statement
global current_frame, current_loop, frame_count, frame_duration, bitmap
while sprite_group:
sprite_group.pop()
filename = SPRITESHEET_FOLDER + "/" + file_list[current_image]
bitmap = displayio.OnDiskBitmap(filename)
### Change the palette value proportional to BRIGHTNESS
bitmap.pixel_shader[1] = image_brightness(brightness)
sprite = displayio.TileGrid(
bitmap,
pixel_shader=bitmap.pixel_shader,
tile_width=bitmap.width,
tile_height=matrix.display.height,
)
sprite_group.append(sprite)
current_frame = 0
current_loop = 0
frame_count = int(bitmap.height / matrix.display.height)
frame_duration = DEFAULT_FRAME_DURATION
def advance_image():
"""
Advance to the next image in the list and loop back at the end
"""
# pylint: disable=global-statement
global current_image
if current_image is not None:
current_image += 1
if current_image is None or current_image >= len(file_list):
current_image = 0
load_image()
def advance_frame():
"""
Advance to the next frame and loop back at the end
"""
# pylint: disable=global-statement
global current_frame, current_loop
current_frame = current_frame + 1
if current_frame >= frame_count:
current_frame = 0
current_loop = current_loop + 1
sprite_group[0][0] = current_frame
advance_image()
last_time = time.monotonic()
while True:
button_down.update()
button_up.update()
if button_up.fell:
advance_image()
if button_down.fell:
brightness = (brightness + 2) % 16
print(brightness)
bitmap.pixel_shader[1] = image_brightness(brightness) # ### Change the brightness
if time.monotonic() - last_time > frame_duration:
advance_frame()
last_time = time.monotonic()