diff --git a/preload/menu.py b/preload/menu.py index 6f325d329dd6fee761ad80571f44fb0f2bf3a227..babdab720279383c638402d6d0a705d1e98b77d9 100644 --- a/preload/menu.py +++ b/preload/menu.py @@ -12,6 +12,9 @@ import os FACTORY_RESET_CMD = "! RESET !" +STATE_MAIN_MENU = "MAIN" +STATE_RESET = "RESET" +STATE_RESET_ARMED = "RESET_ARMED" def list_apps(): @@ -24,11 +27,29 @@ def list_apps(): if "menu.py" in apps: apps.remove("menu.py") - apps.append(FACTORY_RESET_CMD) - return apps +def list_extra_entries(): + return [FACTORY_RESET_CMD] + + +def activate_menu_entry(entryy): + if entryy == FACTORY_RESET_CMD: + return STATE_RESET + + disp.clear().update() + disp.close() + + try: + os.exec(entryy) + except OSError as e: + print("Loading failed: ", e) + os.exit(1) + + return STATE_MAIN_MENU + + def button_events(): """Iterate over button presses (event-loop).""" yield 0 @@ -55,13 +76,13 @@ def button_events(): COLOR1, COLOR2 = (color.CHAOSBLUE_DARK, color.CHAOSBLUE) -def draw_menu(disp, applist, idx, offset): +def draw_menu(disp, menulist, idx, offset): disp.clear() # Wrap around the app-list and draw entries from idx - 3 to idx + 4 - for y, i in enumerate(range(len(applist) + idx - 3, len(applist) + idx + 4)): + for y, i in enumerate(range(len(menulist) + idx - 3, len(menulist) + idx + 4)): disp.print( - " " + applist[i % len(applist)] + " ", + " " + menulist[i % len(menulist)] + " ", posy=offset + y * 20 - 40, bg=COLOR1 if i % 2 == 0 else COLOR2, ) @@ -70,38 +91,61 @@ def draw_menu(disp, applist, idx, offset): disp.update() +def draw_reset(disp, armed): + disp.clear() + + button = "LEFT" if not armed else "RIGHT" + + disp.print("Press %s"%button, posy=0) + disp.print("to perform", posy=20) + disp.print("factory", posy=40) + disp.print("reset", posy=60) + + disp.update() + + def main(): disp = display.open() - applist = list_apps() - numapps = len(applist) + menulist = list_apps() + menulist += list_extra_entries() + numentries = len(menulist) current = 0 + state = STATE_MAIN_MENU for ev in button_events(): - if ev == buttons.BOTTOM_RIGHT: - # Scroll down - draw_menu(disp, applist, current, -8) - current = (current + 1) % numapps - elif ev == buttons.BOTTOM_LEFT: - # Scroll up - draw_menu(disp, applist, current, 8) - current = (current + numapps - 1) % numapps - elif ev == buttons.TOP_RIGHT: - # Select & start - disp.clear().update() - disp.close() - - if applist[current] == FACTORY_RESET_CMD: + # Button handling + if state == STATE_MAIN_MENU: + if ev == buttons.BOTTOM_RIGHT: + # Scroll down + draw_menu(disp, menulist, current, -8) + current = (current + 1) % numentries + elif ev == buttons.BOTTOM_LEFT: + # Scroll up + draw_menu(disp, menulist, current, 8) + current = (current + numentries - 1) % numentries + elif ev == buttons.TOP_RIGHT: + # Select & start + state = activate_menu_entry(menulist[current]) + elif state == STATE_RESET: + if ev == buttons.BOTTOM_LEFT: + state = STATE_RESET_ARMED + else: + state = STATE_MAIN_MENU + elif state == STATE_RESET_ARMED: + if ev == buttons.BOTTOM_RIGHT: files = os.listdir(".") for f in files: os.unlink(f) os.exit(0) else: - try: - os.exec(applist[current]) - except OSError as e: - print("Loading failed: ", e) - os.exit(1) - - draw_menu(disp, applist, current, 0) + state = STATE_MAIN_MENU + + # Output handling + if state == STATE_MAIN_MENU: + draw_menu(disp, menulist, current, 0) + elif state == STATE_RESET: + draw_reset(disp, False) + elif state == STATE_RESET_ARMED: + draw_reset(disp, True) if __name__ == "__main__":