update build script to install reqs for boot.py, boot_animation, and launcher. In launcher use mouse lib, and handle clicks on page arrows

This commit is contained in:
foamyguy 2025-05-10 11:48:05 -05:00
parent 6ae41eaffa
commit 2f6e5fdea0
2 changed files with 32 additions and 104 deletions

View file

@ -107,6 +107,12 @@ def create_font_specific_zip(font_path: Path, src_dir: Path, learn_projects_dir:
for builtin_app_dir in os.listdir("builtin_apps"): for builtin_app_dir in os.listdir("builtin_apps"):
circup_cli(["--path", temp_dir, "install", "--auto", "--auto-file", f"apps/{builtin_app_dir}/code.py"], circup_cli(["--path", temp_dir, "install", "--auto", "--auto-file", f"apps/{builtin_app_dir}/code.py"],
standalone_mode=False) standalone_mode=False)
# install reqs for launcher and boot_animation
circup_cli(["--path", temp_dir, "install", "--auto", "--auto-file", f"code.py"], standalone_mode=False)
circup_cli(["--path", temp_dir, "install", "--auto", "--auto-file", f"boot_animation.py"], standalone_mode=False)
circup_cli(["--path", temp_dir, "install", "--auto", "--auto-file", f"boot.py"], standalone_mode=False)
os.remove(temp_dir / "boot_out.txt") os.remove(temp_dir / "boot_out.txt")
# Create the final zip file # Create the final zip file
with zipfile.ZipFile(output_zip, 'w', zipfile.ZIP_DEFLATED) as zf: with zipfile.ZipFile(output_zip, 'w', zipfile.ZIP_DEFLATED) as zf:

View file

@ -16,7 +16,7 @@ import supervisor
import sys import sys
import terminalio import terminalio
import usb
import adafruit_pathlib as pathlib import adafruit_pathlib as pathlib
from adafruit_bitmap_font import bitmap_font from adafruit_bitmap_font import bitmap_font
from adafruit_display_text.text_box import TextBox from adafruit_display_text.text_box import TextBox
@ -25,7 +25,8 @@ from adafruit_display_text.bitmap_label import Label
from adafruit_displayio_layout.layouts.grid_layout import GridLayout from adafruit_displayio_layout.layouts.grid_layout import GridLayout
from adafruit_anchored_tilegrid import AnchoredTileGrid from adafruit_anchored_tilegrid import AnchoredTileGrid
import adafruit_imageload import adafruit_imageload
import adafruit_usb_host_descriptors
from adafruit_usb_host_mouse import find_and_init_boot_mouse
from adafruit_anchored_group import AnchoredGroup from adafruit_anchored_group import AnchoredGroup
from adafruit_fruitjam.peripherals import request_display_config from adafruit_fruitjam.peripherals import request_display_config
from adafruit_argv_file import read_argv, write_argv from adafruit_argv_file import read_argv, write_argv
@ -78,86 +79,8 @@ bg_palette[0] = 0x222222
bg_tg = displayio.TileGrid(bitmap=background_bmp, pixel_shader=bg_palette) bg_tg = displayio.TileGrid(bitmap=background_bmp, pixel_shader=bg_palette)
scaled_group.append(bg_tg) scaled_group.append(bg_tg)
# load the mouse cursor bitmap mouse = find_and_init_boot_mouse()
mouse_bmp = displayio.OnDiskBitmap("launcher_assets/mouse_cursor.bmp")
# make the background pink pixels transparent
mouse_bmp.pixel_shader.make_transparent(0)
# create a TileGrid for the mouse, using its bitmap and pixel_shader
mouse_tg = displayio.TileGrid(mouse_bmp, pixel_shader=mouse_bmp.pixel_shader)
# move it to the center of the display
mouse_tg.x = display.width // (2 * scale)
mouse_tg.y = display.height // (2 * scale)
# 046d:c52f
# mouse = usb.core.find(idVendor=0x046d, idProduct=0xc52f)
DIR_IN = 0x80
mouse_interface_index, mouse_endpoint_address = None, None
mouse = None
# scan for connected USB device and loop over any found
print("scanning usb")
for device in usb.core.find(find_all=True):
# print device info
print(f"{device.idVendor:04x}:{device.idProduct:04x}")
print(device.manufacturer, device.product)
print()
config_descriptor = adafruit_usb_host_descriptors.get_configuration_descriptor(
device, 0
)
print(config_descriptor)
#
# i = 0
# while i < len(config_descriptor):
# descriptor_len = config_descriptor[i]
# descriptor_type = config_descriptor[i + 1]
# if descriptor_type == adafruit_usb_host_descriptors.DESC_CONFIGURATION:
# config_value = config_descriptor[i + 5]
# print(f" value {config_value:d}")
# elif descriptor_type == adafruit_usb_host_descriptors.DESC_INTERFACE:
# interface_number = config_descriptor[i + 2]
# interface_class = config_descriptor[i + 5]
# interface_subclass = config_descriptor[i + 6]
# interface_protocol = config_descriptor[i + 7]
# print(f" interface[{interface_number:d}]")
# print(
# f" class {interface_class:02x} subclass {interface_subclass:02x}"
# )
# print(f"protocol: {interface_protocol}")
# elif descriptor_type == adafruit_usb_host_descriptors.DESC_ENDPOINT:
# endpoint_address = config_descriptor[i + 2]
# if endpoint_address & DIR_IN:
# print(f" IN {endpoint_address:02x}")
# else:
# print(f" OUT {endpoint_address:02x}")
# i += descriptor_len
# print()
#
# # assume the device is the mouse
# mouse = device
_possible_interface_index, _possible_endpoint_address = adafruit_usb_host_descriptors.find_boot_mouse_endpoint(device)
if _possible_interface_index is not None and _possible_endpoint_address is not None:
mouse = device
mouse_interface_index = _possible_interface_index
mouse_endpoint_address = _possible_endpoint_address
print(f"mouse interface: {mouse_interface_index} endpoint_address: {hex(mouse_endpoint_address)}")
mouse_was_attached = None
if mouse is not None:
# detach the kernel driver if needed
if mouse.is_kernel_driver_active(0):
mouse_was_attached = True
mouse.detach_kernel_driver(0)
else:
mouse_was_attached = False
# set configuration on the mouse so we can use it
mouse.set_configuration()
mouse_buf = array.array("b", [0] * 8)
WIDTH = 280 WIDTH = 280
HEIGHT = 182 HEIGHT = 182
@ -370,8 +293,10 @@ if len(apps) <= 6:
right_tg.hidden = True right_tg.hidden = True
left_tg.hidden = True left_tg.hidden = True
if mouse: if mouse is not None:
scaled_group.append(mouse_tg) mouse.scale = 2
mouse.x = display.width - 6
scaled_group.append(mouse.tilegrid)
help_txt = Label(terminalio.FONT, text="[Arrow]: Move\n[E]: Edit\n[Enter]: Run") help_txt = Label(terminalio.FONT, text="[Arrow]: Move\n[E]: Edit\n[Enter]: Run")
@ -391,8 +316,8 @@ def atexit_callback():
:return: :return:
""" """
print("inside atexit callback") print("inside atexit callback")
if mouse_was_attached and not mouse.is_kernel_driver_active(0): if mouse is not None:
mouse.attach_kernel_driver(0) mouse.release()
atexit.register(atexit_callback) atexit.register(atexit_callback)
@ -501,7 +426,7 @@ def handle_key_press(key):
print(f"apps: {apps}") print(f"apps: {apps}")
print(mouse_interface_index, mouse_endpoint_address) # print(mouse_interface_index, mouse_endpoint_address)
while True: while True:
index = None index = None
editor_index = None editor_index = None
@ -517,26 +442,23 @@ while True:
# app_titles[selected].background_color = 0x008800 # app_titles[selected].background_color = 0x008800
if mouse: if mouse:
try: pressed_btns = mouse.update()
# attempt to read data from the mouse
# 10ms timeout, so we don't block long if there
# is no data
count = mouse.read(mouse_endpoint_address, mouse_buf, timeout=20)
except usb.core.USBTimeoutError:
# skip the rest of the loop if there is no data
count = 0
# update the mouse tilegrid x and y coordinates if pressed_btns is not None and "left" in pressed_btns:
# based on the delta values read from the mouse print("left click")
if count > 0: clicked_cell = menu_grid.which_cell_contains((mouse.x, mouse.y))
mouse_tg.x = max(0, min((display.width // scale) - 1, mouse_tg.x + mouse_buf[1])) if clicked_cell is not None:
mouse_tg.y = max(0, min((display.height // scale) - 1, mouse_tg.y + mouse_buf[2])) index = clicked_cell[1] * config["width"] + clicked_cell[0]
if mouse_buf[0] & (1 << 0) != 0: clicked_coords = (mouse.x, mouse.y, 0)
print("left click") if left_tg.contains(clicked_coords):
clicked_cell = menu_grid.which_cell_contains((mouse_tg.x, mouse_tg.y)) if cur_page > 0:
if clicked_cell is not None: cur_page -= 1
index = clicked_cell[1] * config["width"] + clicked_cell[0] display_page(cur_page)
elif right_tg.contains(clicked_coords):
if cur_page < math.ceil(len(apps) / 6) - 1:
cur_page += 1
display_page(cur_page)
if index is not None: if index is not None:
print("index", index) print("index", index)