128 lines
3.3 KiB
Python
128 lines
3.3 KiB
Python
import os
|
|
import sys
|
|
import time
|
|
import badger2040
|
|
from badger2040 import HEIGHT
|
|
import badger_os
|
|
|
|
|
|
REAMDE = """
|
|
Images must be 296x128 pixel with 1bit colour depth.
|
|
|
|
You can use examples/badger2040/image_converter/convert.py to convert them:
|
|
|
|
python3 convert.py --binary --resize image_file_1.png image_file_2.png image_file_3.png
|
|
|
|
Create a new "images" directory via Thonny, and upload the .bin files there.
|
|
"""
|
|
|
|
OVERLAY_BORDER = 40
|
|
OVERLAY_SPACING = 20
|
|
OVERLAY_TEXT_SIZE = 0.5
|
|
|
|
TOTAL_IMAGES = 0
|
|
|
|
|
|
# Turn the act LED on as soon as possible
|
|
display = badger2040.Badger2040()
|
|
display.led(128)
|
|
|
|
# Try to preload BadgerPunk image
|
|
try:
|
|
os.mkdir("images")
|
|
import badgerpunk
|
|
with open("images/badgerpunk.bin", "wb") as f:
|
|
f.write(badgerpunk.data())
|
|
f.flush()
|
|
with open("images/readme.txt", "w") as f:
|
|
f.write(REAMDE)
|
|
f.flush()
|
|
del badgerpunk
|
|
except (OSError, ImportError):
|
|
pass
|
|
|
|
# Load images
|
|
try:
|
|
IMAGES = [f for f in os.listdir("/images") if f.endswith(".bin")]
|
|
TOTAL_IMAGES = len(IMAGES)
|
|
except OSError:
|
|
pass
|
|
|
|
|
|
image = bytearray(int(296 * 128 / 8))
|
|
|
|
state = {
|
|
"current_image": 0,
|
|
"show_info": True
|
|
}
|
|
|
|
|
|
def show_image(n):
|
|
file = IMAGES[n]
|
|
name = file.split(".")[0]
|
|
open("images/{}".format(file), "r").readinto(image)
|
|
display.image(image)
|
|
|
|
if state["show_info"]:
|
|
name_length = display.measure_text(name, 0.5)
|
|
display.pen(0)
|
|
display.rectangle(0, HEIGHT - 21, name_length + 11, 21)
|
|
display.pen(15)
|
|
display.rectangle(0, HEIGHT - 20, name_length + 10, 20)
|
|
display.pen(0)
|
|
display.text(name, 5, HEIGHT - 10, 0.5)
|
|
|
|
for i in range(TOTAL_IMAGES):
|
|
x = 286
|
|
y = int((128 / 2) - (TOTAL_IMAGES * 10 / 2) + (i * 10))
|
|
display.pen(0)
|
|
display.rectangle(x, y, 8, 8)
|
|
if state["current_image"] != i:
|
|
display.pen(15)
|
|
display.rectangle(x + 1, y + 1, 6, 6)
|
|
|
|
display.update()
|
|
|
|
|
|
if TOTAL_IMAGES == 0:
|
|
display.pen(15)
|
|
display.clear()
|
|
badger_os.warning(display, "To run this demo, create an /images directory on your device and upload some 1bit 296x128 pixel images.")
|
|
time.sleep(4.0)
|
|
sys.exit()
|
|
|
|
|
|
badger_os.state_load("image", state)
|
|
|
|
changed = not badger2040.woken_by_button()
|
|
|
|
|
|
while True:
|
|
if display.pressed(badger2040.BUTTON_UP):
|
|
if state["current_image"] > 0:
|
|
state["current_image"] -= 1
|
|
changed = True
|
|
if display.pressed(badger2040.BUTTON_DOWN):
|
|
if state["current_image"] < TOTAL_IMAGES - 1:
|
|
state["current_image"] += 1
|
|
changed = True
|
|
if display.pressed(badger2040.BUTTON_A):
|
|
state["show_info"] = not state["show_info"]
|
|
changed = True
|
|
if display.pressed(badger2040.BUTTON_B) or display.pressed(badger2040.BUTTON_C):
|
|
display.pen(15)
|
|
display.clear()
|
|
badger_os.warning(display, "To add images connect Badger2040 to a PC, load up Thonny, and see readme.txt in images/")
|
|
display.update()
|
|
print(state["current_image"])
|
|
time.sleep(4)
|
|
changed = True
|
|
|
|
if changed:
|
|
badger_os.state_save("image", state)
|
|
show_image(state["current_image"])
|
|
changed = False
|
|
|
|
# Halt the Badger to save power, it will wake up if any of the front buttons are pressed
|
|
display.halt()
|