diff --git a/micropython/examples/badger2040w/launcher.py b/micropython/examples/badger2040w/launcher.py index cbbf7796..941e21a8 100644 --- a/micropython/examples/badger2040w/launcher.py +++ b/micropython/examples/badger2040w/launcher.py @@ -16,6 +16,7 @@ woken_by_button = badger2040.woken_by_button() # Must be done before we clear_p 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 exited_to_launcher = badger_os.state_clear_running() + badger2040.reset_pressed_to_wake() else: # Otherwise restore previously running app badger_os.state_launch() @@ -116,8 +117,7 @@ def render(): 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): + while display.pressed_any(): time.sleep(0.01) diff --git a/micropython/examples/badger2040w/lib/badger2040w.py b/micropython/examples/badger2040w/lib/badger2040w.py index f5a6f7f5..3b763092 100644 --- a/micropython/examples/badger2040w/lib/badger2040w.py +++ b/micropython/examples/badger2040w/lib/badger2040w.py @@ -45,8 +45,6 @@ SYSTEM_FREQS = [ 250000000 ] -WAKEUP_GPIO_STATE = wakeup.get_gpio_state() - BUTTONS = { BUTTON_DOWN: machine.Pin(BUTTON_DOWN, machine.Pin.IN, machine.Pin.PULL_DOWN), BUTTON_A: machine.Pin(BUTTON_A, machine.Pin.IN, machine.Pin.PULL_DOWN), @@ -55,13 +53,26 @@ BUTTONS = { BUTTON_UP: machine.Pin(BUTTON_UP, machine.Pin.IN, machine.Pin.PULL_DOWN), } +WAKEUP_MASK = 0 + def woken_by_button(): - return WAKEUP_GPIO_STATE & BUTTON_MASK > 0 + return wakeup.get_gpio_state() & BUTTON_MASK > 0 def pressed_to_wake(button): - return WAKEUP_GPIO_STATE & (1 << button) > 0 + return wakeup.get_gpio_state() & (1 << button) > 0 + + +def reset_pressed_to_wake(): + wakeup.reset_gpio_state() + + +def pressed_to_wake_get_once(button): + global WAKEUP_MASK + result = (wakeup.get_gpio_state() & ~WAKEUP_MASK & (1 << button)) > 0 + WAKEUP_MASK |= (1 << button) + return result def system_speed(speed): @@ -114,7 +125,7 @@ class Badger2040W(): pass def pressed(self, button): - return BUTTONS[button].value() == 1 + return BUTTONS[button].value() == 1 or pressed_to_wake_get_once(button) def pressed_any(self): for button in BUTTONS.values(): diff --git a/micropython/modules/wakeup/wakeup.c b/micropython/modules/wakeup/wakeup.c index f6284f71..e5204112 100644 --- a/micropython/modules/wakeup/wakeup.c +++ b/micropython/modules/wakeup/wakeup.c @@ -1,12 +1,14 @@ #include "wakeup.h" STATIC MP_DEFINE_CONST_FUN_OBJ_0(Wakeup_get_gpio_state_obj, Wakeup_get_gpio_state); +STATIC MP_DEFINE_CONST_FUN_OBJ_0(Wakeup_reset_gpio_state_obj, Wakeup_reset_gpio_state); STATIC MP_DEFINE_CONST_FUN_OBJ_0(Wakeup_get_shift_state_obj, Wakeup_get_shift_state); STATIC MP_DEFINE_CONST_FUN_OBJ_0(Wakeup_reset_shift_state_obj, Wakeup_reset_shift_state); STATIC const mp_map_elem_t wakeup_globals_table[] = { { MP_ROM_QSTR(MP_QSTR___name__), MP_ROM_QSTR(MP_QSTR_wakeup) }, { MP_ROM_QSTR(MP_QSTR_get_gpio_state), MP_ROM_PTR(&Wakeup_get_gpio_state_obj) }, + { MP_ROM_QSTR(MP_QSTR_reset_gpio_state), MP_ROM_PTR(&Wakeup_reset_gpio_state_obj) }, { MP_ROM_QSTR(MP_QSTR_get_shift_state), MP_ROM_PTR(&Wakeup_get_shift_state_obj) }, { MP_ROM_QSTR(MP_QSTR_reset_shift_state), MP_ROM_PTR(&Wakeup_reset_shift_state_obj) } }; diff --git a/micropython/modules/wakeup/wakeup.cpp b/micropython/modules/wakeup/wakeup.cpp index afe5c8da..e5127526 100644 --- a/micropython/modules/wakeup/wakeup.cpp +++ b/micropython/modules/wakeup/wakeup.cpp @@ -62,6 +62,11 @@ mp_obj_t Wakeup_get_gpio_state() { return mp_obj_new_int(runtime_wakeup_gpio_state); } +mp_obj_t Wakeup_reset_gpio_state() { + runtime_wakeup_gpio_state = 0; + return mp_const_none; +} + void err_no_sr() { mp_raise_msg(&mp_type_RuntimeError, "Wakeup_get_shift_state: board does not have a shift register."); } diff --git a/micropython/modules/wakeup/wakeup.h b/micropython/modules/wakeup/wakeup.h index 7330b739..d14cff23 100644 --- a/micropython/modules/wakeup/wakeup.h +++ b/micropython/modules/wakeup/wakeup.h @@ -2,5 +2,6 @@ #include "py/objstr.h" extern mp_obj_t Wakeup_get_gpio_state(); +extern mp_obj_t Wakeup_reset_gpio_state(); extern mp_obj_t Wakeup_get_shift_state(); extern mp_obj_t Wakeup_reset_shift_state(); \ No newline at end of file