diff --git a/preload/menu.py b/preload/menu.py index bd9705a37158b252591674984eda7a7bfb186931..2a3794a0dab1a3778725c52e20224aa59aaff376 100644 --- a/preload/menu.py +++ b/preload/menu.py @@ -5,6 +5,7 @@ You can customize this script however you want :) If you want to go back to the default version, just delete this file; the firmware will recreate it on next run. """ +import buttons import collections import color import display @@ -16,17 +17,32 @@ import utime App = collections.namedtuple("App", ["name", "path"]) +# Favorite apps which are shown at the very top of the app list +FAVORITE_APPS = ["personal_state", "ecg"] -def enumerate_apps(): - """List all installed apps.""" + +def enumerate_entries(): for f in os.listdir("/"): if f == "main.py": yield App("Home", f) - for app in sorted(os.listdir("/apps")): + yield App("USB Storage", "USB_STORAGE_FLAG") + + yield from enumerate_apps(FAVORITE_APPS) + + yield from sorted(enumerate_apps(), key=lambda b: b.name.lower()) + + +def enumerate_apps(apps=None): + """List all installed apps.""" + for app in apps or os.listdir("/apps"): if app.startswith("."): continue + # Skip special apps when enumerating from filesystem + if apps is None and app in FAVORITE_APPS: + continue + if app.endswith(".py") or app.endswith(".elf"): yield App(app, "/apps/" + app) continue @@ -43,6 +59,25 @@ def enumerate_apps(): sys.print_exception(e) +def usb_mode(disp): + os.usbconfig(os.USB_FLASH) + + disp.clear(color.CAMPGREEN) + disp.print("USB Storage", posx=3, posy=20, fg=color.CAMPGREEN_DARK) + disp.print("open", posx=52, posy=40, fg=color.CAMPGREEN_DARK) + disp.update() + + # Wait for select button to be released + while buttons.read(0xFF) == buttons.TOP_RIGHT: + pass + + # Wait for any button to be pressed and disable USB storage again + while buttons.read(0xFF) == 0: + pass + + os.usbconfig(os.USB_SERIAL) + + class MainMenu(simple_menu.Menu): timeout = 30.0 @@ -52,6 +87,10 @@ class MainMenu(simple_menu.Menu): def on_select(self, app, index): self.disp.clear().update() try: + if app.path == "USB_STORAGE_FLAG": + usb_mode(self.disp) + return + print("Trying to load " + app.path) os.exec(app.path) except OSError as e: @@ -70,6 +109,14 @@ class MainMenu(simple_menu.Menu): pass +def loading_message(): + with display.open() as disp: + disp.clear(color.CHAOSBLUE) + disp.print("Loading", posx=31, posy=20) + disp.print("menu ...", posx=24, posy=40) + disp.update() + + def no_apps_message(): """Display a warning if no apps are installed.""" with display.open() as disp: @@ -87,8 +134,10 @@ def no_apps_message(): if __name__ == "__main__": + loading_message() + try: - apps = list(enumerate_apps()) + apps = list(enumerate_entries()) except OSError: apps = []