Commit 23250a8e authored by dx's avatar dx

Merge 'Improve main menu'

See merge request !346
parents 3010d8eb a6876823
Pipeline #4167 passed with stages
in 50 seconds
......@@ -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 = []
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment