kopia lustrzana https://github.com/pimoroni/pimoroni-pico
Badger2040: Port more examples.
rodzic
f82e21018f
commit
a02834be9e
|
@ -5,15 +5,17 @@ import badger2040w
|
|||
|
||||
|
||||
display = badger2040w.Badger2040W()
|
||||
display.set_update_speed(3)
|
||||
|
||||
WIDTH, HEIGHT = display.get_bounds()
|
||||
|
||||
display.connect()
|
||||
try:
|
||||
display.connect()
|
||||
if display.isconnected():
|
||||
ntptime.settime()
|
||||
except RuntimeError:
|
||||
pass # no WiFI
|
||||
|
||||
# We're going to keep the badger on, so slow down the system clock if on battery
|
||||
display.set_update_speed(3)
|
||||
|
||||
ntptime.settime()
|
||||
rtc = machine.RTC()
|
||||
|
||||
display.set_font("gothic")
|
||||
|
|
|
@ -0,0 +1,129 @@
|
|||
import badger2040w
|
||||
import badger_os
|
||||
|
||||
# Global Constants
|
||||
FONT_NAMES = (
|
||||
("sans", 0.7, 2),
|
||||
("gothic", 0.7, 2),
|
||||
("cursive", 0.7, 2),
|
||||
("serif", 0.7, 2),
|
||||
("serif_italic", 0.7, 2),
|
||||
("bitmap6", 3, 1),
|
||||
("bitmap8", 2, 1),
|
||||
("bitmap14_outline", 1, 1)
|
||||
)
|
||||
|
||||
WIDTH = badger2040w.WIDTH
|
||||
HEIGHT = badger2040w.HEIGHT
|
||||
|
||||
MENU_TEXT_SIZE = 0.5
|
||||
MENU_SPACING = 16
|
||||
MENU_WIDTH = 84
|
||||
MENU_PADDING = 5
|
||||
|
||||
TEXT_INDENT = MENU_WIDTH + 10
|
||||
|
||||
ARROW_THICKNESS = 3
|
||||
ARROW_WIDTH = 18
|
||||
ARROW_HEIGHT = 14
|
||||
ARROW_PADDING = 2
|
||||
|
||||
|
||||
# ------------------------------
|
||||
# Drawing functions
|
||||
# ------------------------------
|
||||
|
||||
# Draw a upward arrow
|
||||
def draw_up(x, y, width, height, thickness, padding):
|
||||
border = (thickness // 4) + padding
|
||||
display.line(x + border, y + height - border,
|
||||
x + (width // 2), y + border)
|
||||
display.line(x + (width // 2), y + border,
|
||||
x + width - border, y + height - border)
|
||||
|
||||
|
||||
# Draw a downward arrow
|
||||
def draw_down(x, y, width, height, thickness, padding):
|
||||
border = (thickness // 2) + padding
|
||||
display.line(x + border, y + border,
|
||||
x + (width // 2), y + height - border)
|
||||
display.line(x + (width // 2), y + height - border,
|
||||
x + width - border, y + border)
|
||||
|
||||
|
||||
# Draw the frame of the reader
|
||||
def draw_frame():
|
||||
display.set_pen(15)
|
||||
display.clear()
|
||||
display.set_pen(12)
|
||||
display.rectangle(WIDTH - ARROW_WIDTH, 0, ARROW_WIDTH, HEIGHT)
|
||||
display.set_pen(0)
|
||||
draw_up(WIDTH - ARROW_WIDTH, (HEIGHT // 4) - (ARROW_HEIGHT // 2),
|
||||
ARROW_WIDTH, ARROW_HEIGHT, ARROW_THICKNESS, ARROW_PADDING)
|
||||
draw_down(WIDTH - ARROW_WIDTH, ((HEIGHT * 3) // 4) - (ARROW_HEIGHT // 2),
|
||||
ARROW_WIDTH, ARROW_HEIGHT, ARROW_THICKNESS, ARROW_PADDING)
|
||||
|
||||
|
||||
# Draw the fonts and menu
|
||||
def draw_fonts():
|
||||
display.set_font("bitmap8")
|
||||
for i in range(len(FONT_NAMES)):
|
||||
name, size, thickness = FONT_NAMES[i]
|
||||
display.set_pen(0)
|
||||
if i == state["selected_font"]:
|
||||
display.rectangle(0, i * MENU_SPACING, MENU_WIDTH, MENU_SPACING)
|
||||
display.set_pen(15)
|
||||
|
||||
display.text(name, MENU_PADDING, (i * MENU_SPACING) + int((MENU_SPACING - 8) / 2), WIDTH, MENU_TEXT_SIZE)
|
||||
|
||||
name, size, thickness = FONT_NAMES[state["selected_font"]]
|
||||
display.set_font(name)
|
||||
|
||||
y = 0 if name.startswith("bitmap") else 10
|
||||
|
||||
display.set_pen(0)
|
||||
for line in ("The quick", "brown fox", "jumps over", "the lazy dog.", "0123456789", "!\"£$%^&*()"):
|
||||
display.text(line, TEXT_INDENT, y, WIDTH, size)
|
||||
y += 22
|
||||
|
||||
display.update()
|
||||
|
||||
|
||||
# ------------------------------
|
||||
# Program setup
|
||||
# ------------------------------
|
||||
|
||||
# Global variables
|
||||
state = {"selected_font": 0}
|
||||
badger_os.state_load("fonts", state)
|
||||
|
||||
# Create a new Badger and set it to update FAST
|
||||
display = badger2040w.Badger2040W()
|
||||
display.led(128)
|
||||
display.set_update_speed(badger2040w.UPDATE_FAST)
|
||||
|
||||
changed = not badger2040w.woken_by_button()
|
||||
|
||||
# ------------------------------
|
||||
# Main program loop
|
||||
# ------------------------------
|
||||
|
||||
while True:
|
||||
if display.pressed(badger2040w.BUTTON_UP):
|
||||
state["selected_font"] -= 1
|
||||
if state["selected_font"] < 0:
|
||||
state["selected_font"] = len(FONT_NAMES) - 1
|
||||
changed = True
|
||||
if display.pressed(badger2040w.BUTTON_DOWN):
|
||||
state["selected_font"] += 1
|
||||
if state["selected_font"] >= len(FONT_NAMES):
|
||||
state["selected_font"] = 0
|
||||
changed = True
|
||||
|
||||
if changed:
|
||||
draw_frame()
|
||||
draw_fonts()
|
||||
badger_os.state_save("fonts", state)
|
||||
changed = False
|
||||
|
||||
display.halt()
|
|
@ -0,0 +1,40 @@
|
|||
import badger2040w
|
||||
from badger2040w import WIDTH
|
||||
|
||||
TEXT_SIZE = 0.45
|
||||
LINE_HEIGHT = 20
|
||||
|
||||
display = badger2040w.Badger2040W()
|
||||
display.led(128)
|
||||
|
||||
# Clear to white
|
||||
display.set_pen(15)
|
||||
display.clear()
|
||||
|
||||
display.set_font("bitmap8")
|
||||
display.set_pen(0)
|
||||
display.rectangle(0, 0, WIDTH, 16)
|
||||
display.set_pen(15)
|
||||
display.text("badgerOS", 3, 4, WIDTH, 1)
|
||||
display.text("help", WIDTH - display.measure_text("help", 0.4) - 4, 4, WIDTH, 1)
|
||||
|
||||
display.set_font("sans")
|
||||
display.set_pen(0)
|
||||
|
||||
TEXT_SIZE = 0.62
|
||||
y = 20 + int(LINE_HEIGHT / 2)
|
||||
|
||||
display.set_font("sans")
|
||||
display.text("Up/Down - Change page", 0, y, WIDTH, TEXT_SIZE)
|
||||
y += LINE_HEIGHT
|
||||
display.text("a, b or c - Launch app", 0, y, WIDTH, TEXT_SIZE)
|
||||
y += LINE_HEIGHT
|
||||
display.text("a & c - Exit app", 0, y, WIDTH, TEXT_SIZE)
|
||||
y += LINE_HEIGHT
|
||||
|
||||
display.update()
|
||||
|
||||
# Call halt in a loop, on battery this switches off power.
|
||||
# On USB, the app will exit when A+C is pressed because the launcher picks that up.
|
||||
while True:
|
||||
display.halt()
|
|
@ -0,0 +1,119 @@
|
|||
import os
|
||||
import sys
|
||||
import time
|
||||
import badger2040w
|
||||
from badger2040w import HEIGHT, WIDTH
|
||||
import badger_os
|
||||
import jpegdec
|
||||
|
||||
|
||||
REAMDE = """
|
||||
Images must be 296x128 pixel JPEGs
|
||||
|
||||
Create a new "images" directory via Thonny, and upload your .jpg 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 = badger2040w.Badger2040W()
|
||||
display.led(128)
|
||||
|
||||
jpeg = jpegdec.JPEG(display.display)
|
||||
|
||||
# Try to preload BadgerPunk image
|
||||
try:
|
||||
os.mkdir("/images")
|
||||
with open("/images/readme.txt", "w") as f:
|
||||
f.write(REAMDE)
|
||||
f.flush()
|
||||
except (OSError, ImportError):
|
||||
pass
|
||||
|
||||
# Load images
|
||||
try:
|
||||
IMAGES = [f for f in os.listdir("/images") if f.endswith(".jpg")]
|
||||
TOTAL_IMAGES = len(IMAGES)
|
||||
except OSError:
|
||||
pass
|
||||
|
||||
|
||||
state = {
|
||||
"current_image": 0,
|
||||
"show_info": True
|
||||
}
|
||||
|
||||
|
||||
def show_image(n):
|
||||
file = IMAGES[n]
|
||||
name = file.split(".")[0]
|
||||
jpeg.open_file("/images/{}".format(file))
|
||||
jpeg.decode()
|
||||
|
||||
if state["show_info"]:
|
||||
name_length = display.measure_text(name, 0.5)
|
||||
display.set_pen(0)
|
||||
display.rectangle(0, HEIGHT - 21, name_length + 11, 21)
|
||||
display.set_pen(15)
|
||||
display.rectangle(0, HEIGHT - 20, name_length + 10, 20)
|
||||
display.set_pen(0)
|
||||
display.text(name, 5, HEIGHT - 10, WIDTH, 0.5)
|
||||
|
||||
for i in range(TOTAL_IMAGES):
|
||||
x = 286
|
||||
y = int((128 / 2) - (TOTAL_IMAGES * 10 / 2) + (i * 10))
|
||||
display.set_pen(0)
|
||||
display.rectangle(x, y, 8, 8)
|
||||
if state["current_image"] != i:
|
||||
display.set_pen(15)
|
||||
display.rectangle(x + 1, y + 1, 6, 6)
|
||||
|
||||
display.update()
|
||||
|
||||
|
||||
if TOTAL_IMAGES == 0:
|
||||
display.set_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 badger2040w.woken_by_button()
|
||||
|
||||
|
||||
while True:
|
||||
if display.pressed(badger2040w.BUTTON_UP):
|
||||
if state["current_image"] > 0:
|
||||
state["current_image"] -= 1
|
||||
changed = True
|
||||
if display.pressed(badger2040w.BUTTON_DOWN):
|
||||
if state["current_image"] < TOTAL_IMAGES - 1:
|
||||
state["current_image"] += 1
|
||||
changed = True
|
||||
if display.pressed(badger2040w.BUTTON_A):
|
||||
state["show_info"] = not state["show_info"]
|
||||
changed = True
|
||||
if display.pressed(badger2040w.BUTTON_B) or display.pressed(badger2040w.BUTTON_C):
|
||||
display.set_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()
|
|
@ -0,0 +1,45 @@
|
|||
import badger2040w
|
||||
from badger2040w import WIDTH
|
||||
|
||||
TEXT_SIZE = 0.45
|
||||
LINE_HEIGHT = 16
|
||||
|
||||
display = badger2040w.Badger2040W()
|
||||
display.led(128)
|
||||
|
||||
# Clear to white
|
||||
display.set_pen(15)
|
||||
display.clear()
|
||||
|
||||
display.set_font("bitmap8")
|
||||
display.set_pen(0)
|
||||
display.rectangle(0, 0, WIDTH, 16)
|
||||
display.set_pen(15)
|
||||
display.text("badgerOS", 3, 4, WIDTH, 1)
|
||||
display.text("info", WIDTH - display.measure_text("help", 0.4) - 4, 4, WIDTH, 1)
|
||||
|
||||
display.set_font("sans")
|
||||
display.set_pen(0)
|
||||
|
||||
y = 16 + int(LINE_HEIGHT / 2)
|
||||
|
||||
display.text("Made by Pimoroni, powered by MicroPython", 0, y, WIDTH, TEXT_SIZE)
|
||||
y += LINE_HEIGHT
|
||||
display.text("Dual-core RP2040, 133MHz, 264KB RAM", 0, y, WIDTH, TEXT_SIZE)
|
||||
y += LINE_HEIGHT
|
||||
display.text("2MB Flash (1MB OS, 1MB Storage)", 0, y, WIDTH, TEXT_SIZE)
|
||||
y += LINE_HEIGHT
|
||||
display.text("296x128 pixel Black/White e-Ink", 0, y, WIDTH, TEXT_SIZE)
|
||||
y += LINE_HEIGHT
|
||||
y += LINE_HEIGHT
|
||||
|
||||
display.text("For more info:", 0, y, WIDTH, TEXT_SIZE)
|
||||
y += LINE_HEIGHT
|
||||
display.text("https://pimoroni.com/badger2040w", 0, y, WIDTH, TEXT_SIZE)
|
||||
|
||||
display.update()
|
||||
|
||||
# Call halt in a loop, on battery this switches off power.
|
||||
# On USB, the app will exit when A+C is pressed because the launcher picks that up.
|
||||
while True:
|
||||
display.halt()
|
|
@ -0,0 +1,311 @@
|
|||
import binascii
|
||||
|
||||
import badger2040w
|
||||
import badger_os
|
||||
|
||||
# **** Put your list title here *****
|
||||
list_title = "Checklist"
|
||||
list_file = "checklist.txt"
|
||||
|
||||
|
||||
# Global Constantsu
|
||||
WIDTH = badger2040w.WIDTH
|
||||
HEIGHT = badger2040w.HEIGHT
|
||||
|
||||
ARROW_THICKNESS = 3
|
||||
ARROW_WIDTH = 18
|
||||
ARROW_HEIGHT = 14
|
||||
ARROW_PADDING = 2
|
||||
|
||||
MAX_ITEM_CHARS = 26
|
||||
TITLE_TEXT_SIZE = 0.7
|
||||
ITEM_TEXT_SIZE = 0.6
|
||||
ITEM_SPACING = 20
|
||||
|
||||
LIST_START = 40
|
||||
LIST_PADDING = 2
|
||||
LIST_WIDTH = WIDTH - LIST_PADDING - LIST_PADDING - ARROW_WIDTH
|
||||
LIST_HEIGHT = HEIGHT - LIST_START - LIST_PADDING - ARROW_HEIGHT
|
||||
|
||||
|
||||
# Default list items - change the list items by editing checklist.txt
|
||||
list_items = ["Badger", "Badger", "Badger", "Badger", "Badger", "Mushroom", "Mushroom", "Snake"]
|
||||
save_checklist = False
|
||||
|
||||
try:
|
||||
with open("checklist.txt", "r") as f:
|
||||
raw_list_items = f.read()
|
||||
|
||||
if raw_list_items.find(" X\n") != -1:
|
||||
# Have old style checklist, preserve state and note we should resave the list to remove the Xs
|
||||
list_items = []
|
||||
state = {
|
||||
"current_item": 0,
|
||||
"checked": []
|
||||
}
|
||||
for item in raw_list_items.strip().split("\n"):
|
||||
if item.endswith(" X"):
|
||||
state["checked"].append(True)
|
||||
item = item[:-2]
|
||||
else:
|
||||
state["checked"].append(False)
|
||||
list_items.append(item)
|
||||
state["items_hash"] = binascii.crc32("\n".join(list_items))
|
||||
|
||||
badger_os.state_save("list", state)
|
||||
save_checklist = True
|
||||
else:
|
||||
list_items = [item.strip() for item in raw_list_items.strip().split("\n")]
|
||||
|
||||
except OSError:
|
||||
save_checklist = True
|
||||
|
||||
if save_checklist:
|
||||
with open("checklist.txt", "w") as f:
|
||||
for item in list_items:
|
||||
f.write(item + "\n")
|
||||
|
||||
|
||||
# ------------------------------
|
||||
# Drawing functions
|
||||
# ------------------------------
|
||||
|
||||
# Draw the list of items
|
||||
def draw_list(items, item_states, start_item, highlighted_item, x, y, width, height, item_height, columns):
|
||||
item_x = 0
|
||||
item_y = 0
|
||||
current_col = 0
|
||||
for i in range(start_item, len(items)):
|
||||
if i == highlighted_item:
|
||||
display.set_pen(12)
|
||||
display.rectangle(item_x, item_y + y - (item_height // 2), width // columns, item_height)
|
||||
display.set_pen(0)
|
||||
display.text(items[i], item_x + x + item_height, item_y + y, WIDTH, ITEM_TEXT_SIZE)
|
||||
draw_checkbox(item_x, item_y + y - (item_height // 2), item_height, 15, 0, 2, item_states[i], 2)
|
||||
item_y += item_height
|
||||
if item_y >= height - (item_height // 2):
|
||||
item_x += width // columns
|
||||
item_y = 0
|
||||
current_col += 1
|
||||
if current_col >= columns:
|
||||
return
|
||||
|
||||
|
||||
# Draw a upward arrow
|
||||
def draw_up(x, y, width, height, thickness, padding):
|
||||
border = (thickness // 4) + padding
|
||||
display.line(x + border, y + height - border,
|
||||
x + (width // 2), y + border)
|
||||
display.line(x + (width // 2), y + border,
|
||||
x + width - border, y + height - border)
|
||||
|
||||
|
||||
# Draw a downward arrow
|
||||
def draw_down(x, y, width, height, thickness, padding):
|
||||
border = (thickness // 2) + padding
|
||||
display.line(x + border, y + border,
|
||||
x + (width // 2), y + height - border)
|
||||
display.line(x + (width // 2), y + height - border,
|
||||
x + width - border, y + border)
|
||||
|
||||
|
||||
# Draw a left arrow
|
||||
def draw_left(x, y, width, height, thickness, padding):
|
||||
border = (thickness // 2) + padding
|
||||
display.line(x + width - border, y + border,
|
||||
x + border, y + (height // 2))
|
||||
display.line(x + border, y + (height // 2),
|
||||
x + width - border, y + height - border)
|
||||
|
||||
|
||||
# Draw a right arrow
|
||||
def draw_right(x, y, width, height, thickness, padding):
|
||||
border = (thickness // 2) + padding
|
||||
display.line(x + border, y + border,
|
||||
x + width - border, y + (height // 2))
|
||||
display.line(x + width - border, y + (height // 2),
|
||||
x + border, y + height - border)
|
||||
|
||||
|
||||
# Draw a tick
|
||||
def draw_tick(x, y, width, height, thickness, padding):
|
||||
border = (thickness // 2) + padding
|
||||
display.line(x + border, y + ((height * 2) // 3),
|
||||
x + (width // 2), y + height - border)
|
||||
display.line(x + (width // 2), y + height - border,
|
||||
x + width - border, y + border)
|
||||
|
||||
|
||||
# Draw a cross
|
||||
def draw_cross(x, y, width, height, thickness, padding):
|
||||
border = (thickness // 2) + padding
|
||||
display.line(x + border, y + border, x + width - border, y + height - border)
|
||||
display.line(x + width - border, y + border, x + border, y + height - border)
|
||||
|
||||
|
||||
# Draw a checkbox with or without a tick
|
||||
def draw_checkbox(x, y, size, background, foreground, thickness, tick, padding):
|
||||
border = (thickness // 2) + padding
|
||||
display.set_pen(background)
|
||||
display.rectangle(x + border, y + border, size - (border * 2), size - (border * 2))
|
||||
display.set_pen(foreground)
|
||||
display.line(x + border, y + border, x + size - border, y + border)
|
||||
display.line(x + border, y + border, x + border, y + size - border)
|
||||
display.line(x + size - border, y + border, x + size - border, y + size - border)
|
||||
display.line(x + border, y + size - border, x + size - border, y + size - border)
|
||||
if tick:
|
||||
draw_tick(x, y, size, size, thickness, 2 + border)
|
||||
|
||||
|
||||
# ------------------------------
|
||||
# Program setup
|
||||
# ------------------------------
|
||||
|
||||
changed = not badger2040w.woken_by_button()
|
||||
state = {
|
||||
"current_item": 0,
|
||||
}
|
||||
badger_os.state_load("list", state)
|
||||
items_hash = binascii.crc32("\n".join(list_items))
|
||||
if "items_hash" not in state or state["items_hash"] != items_hash:
|
||||
# Item list changed, or not yet written reset the list
|
||||
state["current_item"] = 0
|
||||
state["items_hash"] = items_hash
|
||||
state["checked"] = [False] * len(list_items)
|
||||
changed = True
|
||||
|
||||
# Global variables
|
||||
items_per_page = 0
|
||||
|
||||
# Create a new Badger and set it to update FAST
|
||||
display = badger2040w.Badger2040W()
|
||||
display.led(128)
|
||||
display.set_font("sans")
|
||||
if changed:
|
||||
display.set_update_speed(badger2040w.UPDATE_FAST)
|
||||
else:
|
||||
display.set_update_speed(badger2040w.UPDATE_TURBO)
|
||||
|
||||
# Find out what the longest item is
|
||||
longest_item = 0
|
||||
for i in range(len(list_items)):
|
||||
while True:
|
||||
item = list_items[i]
|
||||
item_length = display.measure_text(item, ITEM_TEXT_SIZE)
|
||||
if item_length > 0 and item_length > LIST_WIDTH - ITEM_SPACING:
|
||||
list_items[i] = item[:-1]
|
||||
else:
|
||||
break
|
||||
longest_item = max(longest_item, display.measure_text(list_items[i], ITEM_TEXT_SIZE))
|
||||
|
||||
|
||||
# And use that to calculate the number of columns we can fit onscreen and how many items that would give
|
||||
list_columns = 1
|
||||
while longest_item + ITEM_SPACING < (LIST_WIDTH // (list_columns + 1)):
|
||||
list_columns += 1
|
||||
|
||||
items_per_page = ((LIST_HEIGHT // ITEM_SPACING) + 1) * list_columns
|
||||
|
||||
|
||||
# ------------------------------
|
||||
# Main program loop
|
||||
# ------------------------------
|
||||
|
||||
while True:
|
||||
if len(list_items) > 0:
|
||||
if display.pressed(badger2040w.BUTTON_A):
|
||||
if state["current_item"] > 0:
|
||||
page = state["current_item"] // items_per_page
|
||||
state["current_item"] = max(state["current_item"] - (items_per_page) // list_columns, 0)
|
||||
if page != state["current_item"] // items_per_page:
|
||||
display.update_speed(badger2040w.UPDATE_FAST)
|
||||
changed = True
|
||||
if display.pressed(badger2040w.BUTTON_B):
|
||||
state["checked"][state["current_item"]] = not state["checked"][state["current_item"]]
|
||||
changed = True
|
||||
if display.pressed(badger2040w.BUTTON_C):
|
||||
if state["current_item"] < len(list_items) - 1:
|
||||
page = state["current_item"] // items_per_page
|
||||
state["current_item"] = min(state["current_item"] + (items_per_page) // list_columns, len(list_items) - 1)
|
||||
if page != state["current_item"] // items_per_page:
|
||||
display.update_speed(badger2040w.UPDATE_FAST)
|
||||
changed = True
|
||||
if display.pressed(badger2040w.BUTTON_UP):
|
||||
if state["current_item"] > 0:
|
||||
state["current_item"] -= 1
|
||||
changed = True
|
||||
if display.pressed(badger2040w.BUTTON_DOWN):
|
||||
if state["current_item"] < len(list_items) - 1:
|
||||
state["current_item"] += 1
|
||||
changed = True
|
||||
|
||||
if changed:
|
||||
badger_os.state_save("list", state)
|
||||
|
||||
display.set_pen(15)
|
||||
display.clear()
|
||||
|
||||
display.set_pen(12)
|
||||
display.rectangle(WIDTH - ARROW_WIDTH, 0, ARROW_WIDTH, HEIGHT)
|
||||
display.rectangle(0, HEIGHT - ARROW_HEIGHT, WIDTH, ARROW_HEIGHT)
|
||||
|
||||
y = LIST_PADDING + 12
|
||||
display.set_pen(0)
|
||||
display.text(list_title, LIST_PADDING, y, WIDTH, TITLE_TEXT_SIZE)
|
||||
|
||||
y += 12
|
||||
display.set_pen(0)
|
||||
display.line(LIST_PADDING, y, WIDTH - LIST_PADDING - ARROW_WIDTH, y)
|
||||
|
||||
if len(list_items) > 0:
|
||||
page_item = 0
|
||||
if items_per_page > 0:
|
||||
page_item = (state["current_item"] // items_per_page) * items_per_page
|
||||
|
||||
# Draw the list
|
||||
display.set_pen(0)
|
||||
draw_list(list_items, state["checked"], page_item, state["current_item"], LIST_PADDING, LIST_START,
|
||||
LIST_WIDTH, LIST_HEIGHT, ITEM_SPACING, list_columns)
|
||||
|
||||
# Draw the interaction button icons
|
||||
display.set_pen(0)
|
||||
|
||||
# Previous item
|
||||
if state["current_item"] > 0:
|
||||
draw_up(WIDTH - ARROW_WIDTH, (HEIGHT // 4) - (ARROW_HEIGHT // 2),
|
||||
ARROW_WIDTH, ARROW_HEIGHT, ARROW_THICKNESS, ARROW_PADDING)
|
||||
|
||||
# Next item
|
||||
if state["current_item"] < (len(list_items) - 1):
|
||||
draw_down(WIDTH - ARROW_WIDTH, ((HEIGHT * 3) // 4) - (ARROW_HEIGHT // 2),
|
||||
ARROW_WIDTH, ARROW_HEIGHT, ARROW_THICKNESS, ARROW_PADDING)
|
||||
|
||||
# Previous column
|
||||
if state["current_item"] > 0:
|
||||
draw_left((WIDTH // 7) - (ARROW_WIDTH // 2), HEIGHT - ARROW_HEIGHT,
|
||||
ARROW_WIDTH, ARROW_HEIGHT, ARROW_THICKNESS, ARROW_PADDING)
|
||||
|
||||
# Next column
|
||||
if state["current_item"] < (len(list_items) - 1):
|
||||
draw_right(((WIDTH * 6) // 7) - (ARROW_WIDTH // 2), HEIGHT - ARROW_HEIGHT,
|
||||
ARROW_WIDTH, ARROW_HEIGHT, ARROW_THICKNESS, ARROW_PADDING)
|
||||
|
||||
if state["checked"][state["current_item"]]:
|
||||
# Tick off item
|
||||
draw_cross((WIDTH // 2) - (ARROW_WIDTH // 2), HEIGHT - ARROW_HEIGHT,
|
||||
ARROW_HEIGHT, ARROW_HEIGHT, ARROW_THICKNESS, ARROW_PADDING)
|
||||
else:
|
||||
# Untick item
|
||||
draw_tick((WIDTH // 2) - (ARROW_WIDTH // 2), HEIGHT - ARROW_HEIGHT,
|
||||
ARROW_HEIGHT, ARROW_HEIGHT, ARROW_THICKNESS, ARROW_PADDING)
|
||||
else:
|
||||
# Say that the list is empty
|
||||
empty_text = "Nothing Here"
|
||||
text_length = display.measure_text(empty_text, ITEM_TEXT_SIZE)
|
||||
display.text(empty_text, ((LIST_PADDING + LIST_WIDTH) - text_length) // 2, (LIST_HEIGHT // 2) + LIST_START - (ITEM_SPACING // 4), WIDTH, ITEM_TEXT_SIZE)
|
||||
|
||||
display.update()
|
||||
display.set_update_speed(badger2040w.UPDATE_TURBO)
|
||||
changed = False
|
||||
|
||||
display.halt()
|
|
@ -0,0 +1,138 @@
|
|||
import badger2040w
|
||||
import qrcode
|
||||
import time
|
||||
import os
|
||||
import badger_os
|
||||
|
||||
# Check that the qrcodes directory exists, if not, make it
|
||||
try:
|
||||
os.mkdir("/qrcodes")
|
||||
except OSError:
|
||||
pass
|
||||
|
||||
# Check that there is a qrcode.txt, if not preload
|
||||
try:
|
||||
text = open("/qrcodes/qrcode.txt", "r")
|
||||
except OSError:
|
||||
text = open("/qrcodes/qrcode.txt", "w")
|
||||
text.write("""https://pimoroni.com/badger2040
|
||||
Badger 2040
|
||||
* 296x128 1-bit e-ink
|
||||
* six user buttons
|
||||
* user LED
|
||||
* 2MB QSPI flash
|
||||
|
||||
Scan this code to learn
|
||||
more about Badger 2040.
|
||||
""")
|
||||
text.flush()
|
||||
text.seek(0)
|
||||
|
||||
# Load all available QR Code Files
|
||||
try:
|
||||
CODES = [f for f in os.listdir("/qrcodes") if f.endswith(".txt")]
|
||||
TOTAL_CODES = len(CODES)
|
||||
except OSError:
|
||||
pass
|
||||
|
||||
|
||||
print(f'There are {TOTAL_CODES} QR Codes available:')
|
||||
for codename in CODES:
|
||||
print(f'File: {codename}')
|
||||
|
||||
display = badger2040w.Badger2040W()
|
||||
|
||||
code = qrcode.QRCode()
|
||||
|
||||
state = {
|
||||
"current_qr": 0
|
||||
}
|
||||
|
||||
|
||||
def measure_qr_code(size, code):
|
||||
w, h = code.get_size()
|
||||
module_size = int(size / w)
|
||||
return module_size * w, module_size
|
||||
|
||||
|
||||
def draw_qr_code(ox, oy, size, code):
|
||||
size, module_size = measure_qr_code(size, code)
|
||||
display.set_pen(15)
|
||||
display.rectangle(ox, oy, size, size)
|
||||
display.set_pen(0)
|
||||
for x in range(size):
|
||||
for y in range(size):
|
||||
if code.get_module(x, y):
|
||||
display.rectangle(ox + x * module_size, oy + y * module_size, module_size, module_size)
|
||||
|
||||
|
||||
def draw_qr_file(n):
|
||||
display.led(128)
|
||||
file = CODES[n]
|
||||
codetext = open("/qrcodes/{}".format(file), "r")
|
||||
|
||||
lines = codetext.read().strip().split("\n")
|
||||
code_text = lines.pop(0)
|
||||
title_text = lines.pop(0)
|
||||
detail_text = lines
|
||||
|
||||
# Clear the Display
|
||||
display.set_pen(15) # Change this to 0 if a white background is used
|
||||
display.clear()
|
||||
display.set_pen(0)
|
||||
|
||||
code.set_text(code_text)
|
||||
size, _ = measure_qr_code(128, code)
|
||||
left = top = int((badger2040w.HEIGHT / 2) - (size / 2))
|
||||
draw_qr_code(left, top, 128, code)
|
||||
|
||||
left = 128 + 5
|
||||
|
||||
display.text(title_text, left, 20, badger2040w.WIDTH, 2)
|
||||
|
||||
top = 40
|
||||
for line in detail_text:
|
||||
display.text(line, left, top, badger2040w.WIDTH, 1)
|
||||
top += 10
|
||||
|
||||
if TOTAL_CODES > 1:
|
||||
for i in range(TOTAL_CODES):
|
||||
x = 286
|
||||
y = int((128 / 2) - (TOTAL_CODES * 10 / 2) + (i * 10))
|
||||
display.set_pen(0)
|
||||
display.rectangle(x, y, 8, 8)
|
||||
if state["current_qr"] != i:
|
||||
display.set_pen(15)
|
||||
display.rectangle(x + 1, y + 1, 6, 6)
|
||||
display.update()
|
||||
|
||||
|
||||
badger_os.state_load("qrcodes", state)
|
||||
changed = not badger2040w.woken_by_button()
|
||||
|
||||
while True:
|
||||
if TOTAL_CODES > 1:
|
||||
if display.pressed(badger2040w.BUTTON_UP):
|
||||
if state["current_qr"] > 0:
|
||||
state["current_qr"] -= 1
|
||||
changed = True
|
||||
|
||||
if display.pressed(badger2040w.BUTTON_DOWN):
|
||||
if state["current_qr"] < TOTAL_CODES - 1:
|
||||
state["current_qr"] += 1
|
||||
changed = True
|
||||
|
||||
if display.pressed(badger2040w.BUTTON_B) or display.pressed(badger2040w.BUTTON_C):
|
||||
display.set_pen(15)
|
||||
display.clear()
|
||||
badger_os.warning(display, "To add QR codes, connect Badger2040W to a PC, load up Thonny, and see qrgen.py.")
|
||||
time.sleep(4)
|
||||
changed = True
|
||||
|
||||
if changed:
|
||||
draw_qr_file(state["current_qr"])
|
||||
badger_os.state_save("qrcodes", state)
|
||||
changed = False
|
||||
|
||||
# Halt the Badger to save power, it will wake up if any of the front buttons are pressed
|
||||
display.halt()
|
|
@ -0,0 +1,3 @@
|
|||
Images must be 296x128 pixel JPEGs
|
||||
|
||||
Create a new "images" directory via Thonny, and upload your .jpg files there.
|
Plik binarny nie jest wyświetlany.
Po Szerokość: | Wysokość: | Rozmiar: 9.0 KiB |
|
@ -1,4 +1,6 @@
|
|||
*.py
|
||||
lib/*.py
|
||||
examples/*.jpg
|
||||
examples/*.py
|
||||
examples/*.py
|
||||
images/*.jpg
|
||||
images/*.txt
|
Ładowanie…
Reference in New Issue