136 lines
3.6 KiB
Python
Executable file
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.root_group = 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()
|