diff --git a/micropython/examples/badger2040/list.py b/micropython/examples/badger2040/list.py index d71bc039..a2bb836f 100644 --- a/micropython/examples/badger2040/list.py +++ b/micropython/examples/badger2040/list.py @@ -1,12 +1,9 @@ import badger2040 -import machine -import time +import badger_os # **** Put your list title and contents here ***** list_title = "Checklist" -list_content = ["Badger", "Badger", "Badger", "Badger", "Badger", "Mushroom", "Mushroom", "Snake"] -list_states = [False] * len(list_content) -list_file = "checklist.txt" +list_items = ["Badger", "Badger", "Badger", "Badger", "Badger", "Mushroom", "Mushroom", "Snake"] # Global Constants @@ -29,16 +26,6 @@ LIST_WIDTH = WIDTH - LIST_PADDING - LIST_PADDING - ARROW_WIDTH LIST_HEIGHT = HEIGHT - LIST_START - LIST_PADDING - ARROW_HEIGHT -def save_list(): - with open(list_file, "w") as f: - f.write(list_title + "\n") - for i in range(len(list_content)): - list_item = list_content[i] - if list_states[i]: - list_item += " X" - f.write(list_item + "\n") - - # ------------------------------ # Drawing functions # ------------------------------ @@ -135,35 +122,40 @@ def draw_checkbox(x, y, size, background, foreground, thickness, tick, padding): # Program setup # ------------------------------ +changed = not badger2040.woken_by_button() +state = { + "current_item": 0, +} +badger_os.state_load("list", state) +if "items" not in state or state["items"] != list_items: + # Item list changed, or not yet written reset the list + state["current_item"] = 0 + state["items"] = list_items + state["checked"] = [False] * len(list_items) + changed = True + # Global variables -update = True -needs_save = False -current_item = 0 items_per_page = 0 # Create a new Badger and set it to update FAST display = badger2040.Badger2040() display.led(128) -display.update_speed(badger2040.UPDATE_FAST) - -# Set up the buttons -button_a = machine.Pin(badger2040.BUTTON_A, machine.Pin.IN, machine.Pin.PULL_DOWN) -button_b = machine.Pin(badger2040.BUTTON_B, machine.Pin.IN, machine.Pin.PULL_DOWN) -button_c = machine.Pin(badger2040.BUTTON_C, machine.Pin.IN, machine.Pin.PULL_DOWN) -button_up = machine.Pin(badger2040.BUTTON_UP, machine.Pin.IN, machine.Pin.PULL_DOWN) -button_down = machine.Pin(badger2040.BUTTON_DOWN, machine.Pin.IN, machine.Pin.PULL_DOWN) +if changed: + display.update_speed(badger2040.UPDATE_FAST) +else: + display.update_speed(badger2040.UPDATE_TURBO) # Find out what the longest item is longest_item = 0 -for i in range(len(list_content)): +for i in range(len(state["items"])): while True: - item = list_content[i] + item = state["items"][i] item_length = display.measure_text(item, ITEM_TEXT_SIZE) if item_length > 0 and item_length > LIST_WIDTH - ITEM_SPACING: - list_content[i] = item[:-1] + state["items"][i] = item[:-1] else: break - longest_item = max(longest_item, display.measure_text(list_content[i], ITEM_TEXT_SIZE)) + longest_item = max(longest_item, display.measure_text(state["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 @@ -174,78 +166,41 @@ while longest_item + ITEM_SPACING < (LIST_WIDTH // (list_columns + 1)): items_per_page = ((LIST_HEIGHT // ITEM_SPACING) + 1) * list_columns -# Button handling function -def button(pin): - global update, current_item, needs_save - - time.sleep(0.05) - if not pin.value(): - return - - if button_a.value() and button_c.value(): - machine.reset() - - if len(list_content) > 0 and not update: - if pin == button_a: - if current_item > 0: - current_item = max(current_item - (items_per_page) // list_columns, 0) - update = True - return - if pin == button_b: - list_states[current_item] = not list_states[current_item] - needs_save = True - update = True - return - if pin == button_c: - if current_item < len(list_content) - 1: - current_item = min(current_item + (items_per_page) // list_columns, len(list_content) - 1) - update = True - return - if pin == button_up: - if current_item > 0: - current_item -= 1 - update = True - return - if pin == button_down: - if current_item < len(list_content) - 1: - current_item += 1 - update = True - return - - -# Register the button handling function with the buttons -button_a.irq(trigger=machine.Pin.IRQ_RISING, handler=button) -button_b.irq(trigger=machine.Pin.IRQ_RISING, handler=button) -button_c.irq(trigger=machine.Pin.IRQ_RISING, handler=button) -button_up.irq(trigger=machine.Pin.IRQ_RISING, handler=button) -button_down.irq(trigger=machine.Pin.IRQ_RISING, handler=button) - - # ------------------------------ # Main program loop # ------------------------------ -try: - with open(list_file, "r") as f: - list_content = f.read().strip().split("\n") - list_title = list_content.pop(0) - list_states = [False] * len(list_content) - for i in range(len(list_content)): - list_content[i] = list_content[i].strip() - if list_content[i].endswith(" X"): - list_states[i] = True - list_content[i] = list_content[i][:-2] - -except OSError: - save_list() - - while True: - if needs_save: - save_list() - needs_save = False + if len(state["items"]) > 0: + if display.pressed(badger2040.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(badger2040.UPDATE_FAST) + changed = True + if display.pressed(badger2040.BUTTON_B): + state["checked"][state["current_item"]] = not state["checked"][state["current_item"]] + changed = True + if display.pressed(badger2040.BUTTON_C): + if state["current_item"] < len(state["items"]) - 1: + page = state["current_item"] // items_per_page + state["current_item"] = min(state["current_item"] + (items_per_page) // list_columns, len(state["items"]) - 1) + if page != state["current_item"] // items_per_page: + display.update_speed(badger2040.UPDATE_FAST) + changed = True + if display.pressed(badger2040.BUTTON_UP): + if state["current_item"] > 0: + state["current_item"] -= 1 + changed = True + if display.pressed(badger2040.BUTTON_DOWN): + if state["current_item"] < len(state["items"]) - 1: + state["current_item"] += 1 + changed = True + + if changed: + badger_os.state_save("list", state) - if update: display.pen(15) display.clear() @@ -263,15 +218,15 @@ while True: display.thickness(2) display.line(LIST_PADDING, y, WIDTH - LIST_PADDING - ARROW_WIDTH, y) - if len(list_content) > 0: + if len(state["items"]) > 0: page_item = 0 if items_per_page > 0: - page_item = (current_item // items_per_page) * items_per_page + page_item = (state["current_item"] // items_per_page) * items_per_page # Draw the list display.pen(0) display.thickness(2) - draw_list(list_content, list_states, page_item, current_item, LIST_PADDING, LIST_START, + draw_list(state["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 @@ -279,26 +234,26 @@ while True: display.thickness(ARROW_THICKNESS) # Previous item - if current_item > 0: + 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 current_item < (len(list_content) - 1): + if state["current_item"] < (len(state["items"]) - 1): draw_down(WIDTH - ARROW_WIDTH, ((HEIGHT * 3) // 4) - (ARROW_HEIGHT // 2), ARROW_WIDTH, ARROW_HEIGHT, ARROW_THICKNESS, ARROW_PADDING) # Previous column - if current_item > 0: + 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 current_item < (len(list_content) - 1): + if state["current_item"] < (len(state["items"]) - 1): draw_right(((WIDTH * 6) // 7) - (ARROW_WIDTH // 2), HEIGHT - ARROW_HEIGHT, ARROW_WIDTH, ARROW_HEIGHT, ARROW_THICKNESS, ARROW_PADDING) - if list_states[current_item]: + 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) @@ -314,6 +269,6 @@ while True: display.update() display.update_speed(badger2040.UPDATE_TURBO) - update = False + changed = False - time.sleep(0.1) + display.halt()