Badger2040W: Fix wakeup and quit to launcher button handling.

feature/badger2040w
Phil Howard 2023-01-31 15:20:41 +00:00 zatwierdzone przez Phil Howard
rodzic 26eeb2b042
commit cbcd9edd9a
5 zmienionych plików z 26 dodań i 7 usunięć

Wyświetl plik

@ -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): 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 # Pressing A and C together at start quits app
exited_to_launcher = badger_os.state_clear_running() exited_to_launcher = badger_os.state_clear_running()
badger2040.reset_pressed_to_wake()
else: else:
# Otherwise restore previously running app # Otherwise restore previously running app
badger_os.state_launch() badger_os.state_launch()
@ -116,8 +117,7 @@ def render():
def wait_for_user_to_release_buttons(): def wait_for_user_to_release_buttons():
pr = display.pressed while display.pressed_any():
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) time.sleep(0.01)

Wyświetl plik

@ -45,8 +45,6 @@ SYSTEM_FREQS = [
250000000 250000000
] ]
WAKEUP_GPIO_STATE = wakeup.get_gpio_state()
BUTTONS = { BUTTONS = {
BUTTON_DOWN: machine.Pin(BUTTON_DOWN, machine.Pin.IN, machine.Pin.PULL_DOWN), 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), 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), BUTTON_UP: machine.Pin(BUTTON_UP, machine.Pin.IN, machine.Pin.PULL_DOWN),
} }
WAKEUP_MASK = 0
def woken_by_button(): def woken_by_button():
return WAKEUP_GPIO_STATE & BUTTON_MASK > 0 return wakeup.get_gpio_state() & BUTTON_MASK > 0
def pressed_to_wake(button): 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): def system_speed(speed):
@ -114,7 +125,7 @@ class Badger2040W():
pass pass
def pressed(self, button): 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): def pressed_any(self):
for button in BUTTONS.values(): for button in BUTTONS.values():

Wyświetl plik

@ -1,12 +1,14 @@
#include "wakeup.h" #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_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_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 MP_DEFINE_CONST_FUN_OBJ_0(Wakeup_reset_shift_state_obj, Wakeup_reset_shift_state);
STATIC const mp_map_elem_t wakeup_globals_table[] = { 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___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_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_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) } { MP_ROM_QSTR(MP_QSTR_reset_shift_state), MP_ROM_PTR(&Wakeup_reset_shift_state_obj) }
}; };

Wyświetl plik

@ -62,6 +62,11 @@ mp_obj_t Wakeup_get_gpio_state() {
return mp_obj_new_int(runtime_wakeup_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() { void err_no_sr() {
mp_raise_msg(&mp_type_RuntimeError, "Wakeup_get_shift_state: board does not have a shift register."); mp_raise_msg(&mp_type_RuntimeError, "Wakeup_get_shift_state: board does not have a shift register.");
} }

Wyświetl plik

@ -2,5 +2,6 @@
#include "py/objstr.h" #include "py/objstr.h"
extern mp_obj_t Wakeup_get_gpio_state(); 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_get_shift_state();
extern mp_obj_t Wakeup_reset_shift_state(); extern mp_obj_t Wakeup_reset_shift_state();