From 75d011242103ee464168496a0d534885e324d780 Mon Sep 17 00:00:00 2001 From: Phil Howard Date: Fri, 25 Mar 2022 14:55:08 +0000 Subject: [PATCH 1/4] Badger2040: Wait for buttons to be released. Rename woken. --- micropython/modules/badger2040/badger2040.c | 7 +++---- micropython/modules/badger2040/badger2040.cpp | 12 ++++++++++-- micropython/modules/badger2040/badger2040.h | 2 +- 3 files changed, 14 insertions(+), 7 deletions(-) diff --git a/micropython/modules/badger2040/badger2040.c b/micropython/modules/badger2040/badger2040.c index 536811d0..2b42a96a 100644 --- a/micropython/modules/badger2040/badger2040.c +++ b/micropython/modules/badger2040/badger2040.c @@ -9,9 +9,6 @@ MP_DEFINE_CONST_FUN_OBJ_1(Badger2040_is_busy_obj, Badger2040_is_busy); MP_DEFINE_CONST_FUN_OBJ_1(Badger2040_update_obj, Badger2040_update); MP_DEFINE_CONST_FUN_OBJ_KW(Badger2040_partial_update_obj, 4, Badger2040_partial_update); -MP_DEFINE_CONST_FUN_OBJ_1(Badger2040_halt_obj, Badger2040_halt); -MP_DEFINE_CONST_FUN_OBJ_1(Badger2040_woken_obj, Badger2040_woken); - MP_DEFINE_CONST_FUN_OBJ_2(Badger2040_invert_obj, Badger2040_invert); MP_DEFINE_CONST_FUN_OBJ_2(Badger2040_led_obj, Badger2040_led); MP_DEFINE_CONST_FUN_OBJ_2(Badger2040_font_obj, Badger2040_font); @@ -38,6 +35,8 @@ MP_DEFINE_CONST_FUN_OBJ_3(Badger2040_command_obj, Badger2040_command); MP_DEFINE_CONST_FUN_OBJ_1(Badger2040_pressed_to_wake_obj, Badger2040_pressed_to_wake); MP_DEFINE_CONST_FUN_OBJ_0(Badger2040_clear_pressed_to_wake_obj, Badger2040_clear_pressed_to_wake); +MP_DEFINE_CONST_FUN_OBJ_1(Badger2040_halt_obj, Badger2040_halt); +MP_DEFINE_CONST_FUN_OBJ_0(Badger2040_woken_by_button_obj, Badger2040_woken_by_button); /***** Binding of Methods *****/ STATIC const mp_rom_map_elem_t Badger2040_locals_dict_table[] = { @@ -48,7 +47,6 @@ STATIC const mp_rom_map_elem_t Badger2040_locals_dict_table[] = { { MP_ROM_QSTR(MP_QSTR_partial_update), MP_ROM_PTR(&Badger2040_partial_update_obj) }, { MP_ROM_QSTR(MP_QSTR_halt), MP_ROM_PTR(&Badger2040_halt_obj) }, - { MP_ROM_QSTR(MP_QSTR_woken), MP_ROM_PTR(&Badger2040_woken_obj) }, { MP_ROM_QSTR(MP_QSTR_invert), MP_ROM_PTR(&Badger2040_invert_obj) }, { MP_ROM_QSTR(MP_QSTR_led), MP_ROM_PTR(&Badger2040_led_obj) }, @@ -95,6 +93,7 @@ STATIC const mp_rom_map_elem_t badger2040_globals_table[] = { { MP_ROM_QSTR(MP_QSTR_pressed_to_wake), MP_ROM_PTR(&Badger2040_pressed_to_wake_obj) }, { MP_ROM_QSTR(MP_QSTR_clear_pressed_to_wake), MP_ROM_PTR(&Badger2040_clear_pressed_to_wake_obj) }, + { MP_ROM_QSTR(MP_QSTR_woken_by_button), MP_ROM_PTR(&Badger2040_woken_by_button_obj) }, { MP_ROM_QSTR(MP_QSTR_UPDATE_NORMAL), MP_ROM_INT(0) }, { MP_ROM_QSTR(MP_QSTR_UPDATE_MEDIUM), MP_ROM_INT(1) }, diff --git a/micropython/modules/badger2040/badger2040.cpp b/micropython/modules/badger2040/badger2040.cpp index 5b6d6f62..464655b0 100644 --- a/micropython/modules/badger2040/badger2040.cpp +++ b/micropython/modules/badger2040/badger2040.cpp @@ -14,6 +14,10 @@ namespace { gpio_put(pimoroni::Badger2040::ENABLE_3V3, 1); } + bool get_current() { + return gpio_get_all() & (0x1f << pimoroni::Badger2040::DOWN); + } + bool any() const { return state > 0; } @@ -209,8 +213,7 @@ MICROPY_EVENT_POLL_HOOK return mp_const_none; } -mp_obj_t Badger2040_woken(mp_obj_t self_in) { - (void)self_in; +mp_obj_t Badger2040_woken_by_button() { return button_wake_state.any() ? mp_const_true : mp_const_false; } @@ -282,6 +285,11 @@ mp_obj_t Badger2040_pressed_to_wake2(mp_obj_t self_in, mp_obj_t button) { mp_obj_t Badger2040_clear_pressed_to_wake() { button_wake_state.clear(); + while(button_wake_state.get_current()) { +#ifdef MICROPY_EVENT_POLL_HOOK +MICROPY_EVENT_POLL_HOOK +#endif + } return mp_const_none; } diff --git a/micropython/modules/badger2040/badger2040.h b/micropython/modules/badger2040/badger2040.h index 0586b3e1..ae08294a 100644 --- a/micropython/modules/badger2040/badger2040.h +++ b/micropython/modules/badger2040/badger2040.h @@ -16,7 +16,6 @@ extern mp_obj_t Badger2040_update(mp_obj_t self_in); extern mp_obj_t Badger2040_partial_update(size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args); extern mp_obj_t Badger2040_halt(mp_obj_t self_in); -extern mp_obj_t Badger2040_woken(mp_obj_t self_in); extern mp_obj_t Badger2040_invert(mp_obj_t self_in, mp_obj_t invert); extern mp_obj_t Badger2040_led(mp_obj_t self_in, mp_obj_t brightness); @@ -45,3 +44,4 @@ extern mp_obj_t Badger2040_command(mp_obj_t self_in, mp_obj_t reg, mp_obj_t data extern mp_obj_t Badger2040_pressed_to_wake(mp_obj_t button); extern mp_obj_t Badger2040_clear_pressed_to_wake(); +extern mp_obj_t Badger2040_woken_by_button(); From 5c2cc7ebf8caaefb362f23564e110af8f49bc79a Mon Sep 17 00:00:00 2001 From: Phil Howard Date: Fri, 25 Mar 2022 14:55:56 +0000 Subject: [PATCH 2/4] Badger2040: Improve launcher. --- micropython/examples/badger2040/badger_os.py | 2 ++ micropython/examples/badger2040/image.py | 2 +- micropython/examples/badger2040/launcher.py | 16 ++++++++-------- 3 files changed, 11 insertions(+), 9 deletions(-) diff --git a/micropython/examples/badger2040/badger_os.py b/micropython/examples/badger2040/badger_os.py index ef2a1e20..928cfa8e 100644 --- a/micropython/examples/badger2040/badger_os.py +++ b/micropython/examples/badger2040/badger_os.py @@ -54,7 +54,9 @@ def state_running(): def state_clear_running(): + running = state_running() state_modify("launcher", {"running": "launcher"}) + return running != "launcher" def state_set_running(app): diff --git a/micropython/examples/badger2040/image.py b/micropython/examples/badger2040/image.py index ccaf01e5..db31fc15 100644 --- a/micropython/examples/badger2040/image.py +++ b/micropython/examples/badger2040/image.py @@ -94,7 +94,7 @@ if TOTAL_IMAGES == 0: badger_os.state_load("image", state) -changed = not display.woken() +changed = not badger2040.woken_by_button() while True: diff --git a/micropython/examples/badger2040/launcher.py b/micropython/examples/badger2040/launcher.py index 5c33b892..14b94593 100644 --- a/micropython/examples/badger2040/launcher.py +++ b/micropython/examples/badger2040/launcher.py @@ -10,9 +10,13 @@ import badger_os # Reduce clock speed to 48MHz, that's fast enough! machine.freq(48000000) +changed = False +exited_to_launcher = False +woken_by_button = badger2040.woken_by_button() # Must be done before we clear_pressed_to_wake + if badger2040.pressed_to_wake(badger2040.BUTTON_A) and badger2040.pressed_to_wake(badger2040.BUTTON_C): # Pressing A and C together at start quits app - badger_os.state_clear_running() + exited_to_launcher = badger_os.state_clear_running() badger2040.clear_pressed_to_wake() else: # Otherwise restore previously running app @@ -33,7 +37,8 @@ state = { } badger_os.state_load("launcher", state) -changed = state["running"] != "launcher" + +display.invert(state["inverted"]) icons = bytearray(launchericons.data()) icons_width = 576 @@ -206,16 +211,11 @@ def button(pin): render() -if changed: - # Wait for any wakeup button to be released - while display.pressed(badger2040.BUTTON_A) or display.pressed(badger2040.BUTTON_B) or display.pressed(badger2040.BUTTON_C) or display.pressed(badger2040.BUTTON_UP) or display.pressed(badger2040.BUTTON_DOWN): - time.sleep(0.01) +if exited_to_launcher or not woken_by_button: display.update_speed(badger2040.UPDATE_MEDIUM) render() display.update_speed(badger2040.UPDATE_FAST) -if not changed and not display.woken(): - render() while True: if display.pressed(badger2040.BUTTON_A): From b497422bdbe01130533c74f08b83ee8a1dff7698 Mon Sep 17 00:00:00 2001 From: Phil Howard Date: Fri, 25 Mar 2022 15:13:03 +0000 Subject: [PATCH 3/4] Badger2040: Remove button release wait from clear. --- micropython/modules/badger2040/badger2040.cpp | 9 --------- 1 file changed, 9 deletions(-) diff --git a/micropython/modules/badger2040/badger2040.cpp b/micropython/modules/badger2040/badger2040.cpp index 464655b0..024074ee 100644 --- a/micropython/modules/badger2040/badger2040.cpp +++ b/micropython/modules/badger2040/badger2040.cpp @@ -14,10 +14,6 @@ namespace { gpio_put(pimoroni::Badger2040::ENABLE_3V3, 1); } - bool get_current() { - return gpio_get_all() & (0x1f << pimoroni::Badger2040::DOWN); - } - bool any() const { return state > 0; } @@ -285,11 +281,6 @@ mp_obj_t Badger2040_pressed_to_wake2(mp_obj_t self_in, mp_obj_t button) { mp_obj_t Badger2040_clear_pressed_to_wake() { button_wake_state.clear(); - while(button_wake_state.get_current()) { -#ifdef MICROPY_EVENT_POLL_HOOK -MICROPY_EVENT_POLL_HOOK -#endif - } return mp_const_none; } From 3042191c7ee129377a8eadfacede3e341281f8be Mon Sep 17 00:00:00 2001 From: Phil Howard Date: Fri, 25 Mar 2022 15:14:34 +0000 Subject: [PATCH 4/4] Badger2040: Fix exit to launcher. --- micropython/examples/badger2040/badger_os.py | 2 -- micropython/examples/badger2040/launcher.py | 10 ++++++++-- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/micropython/examples/badger2040/badger_os.py b/micropython/examples/badger2040/badger_os.py index 928cfa8e..7fb321ea 100644 --- a/micropython/examples/badger2040/badger_os.py +++ b/micropython/examples/badger2040/badger_os.py @@ -112,8 +112,6 @@ def launch(file): def quit_to_launcher(pin): if button_a.value() and button_c.value(): - state_clear_running() - time.sleep(0.1) # Needed to stop write fail machine.reset() button_a.irq(trigger=machine.Pin.IRQ_RISING, handler=quit_to_launcher) diff --git a/micropython/examples/badger2040/launcher.py b/micropython/examples/badger2040/launcher.py index 14b94593..f003a940 100644 --- a/micropython/examples/badger2040/launcher.py +++ b/micropython/examples/badger2040/launcher.py @@ -160,10 +160,15 @@ def render(): display.update() -def launch_example(index): - while display.pressed(badger2040.BUTTON_A) or display.pressed(badger2040.BUTTON_B) or display.pressed(badger2040.BUTTON_C) or display.pressed(badger2040.BUTTON_UP) or display.pressed(badger2040.BUTTON_DOWN): +def wait_for_user_to_release_buttons(): + pr = display.pressed + while pr(badger2040.BUTTON_A) or pr(badger2040.BUTTON_B) or pr(badger2040.BUTTON_C) or pr(badger2040.BUTTON_UP) or pr(badger2040.BUTTON_DOWN): time.sleep(0.01) + +def launch_example(index): + wait_for_user_to_release_buttons() + file = examples[(state["page"] * 3) + index][0] for k in locals().keys(): @@ -212,6 +217,7 @@ def button(pin): if exited_to_launcher or not woken_by_button: + wait_for_user_to_release_buttons() display.update_speed(badger2040.UPDATE_MEDIUM) render()