diff options
Diffstat (limited to 'stmhal/usrsw.c')
-rw-r--r-- | stmhal/usrsw.c | 103 |
1 files changed, 70 insertions, 33 deletions
diff --git a/stmhal/usrsw.c b/stmhal/usrsw.c index 72f9ec28cc..fd90aaf2a1 100644 --- a/stmhal/usrsw.c +++ b/stmhal/usrsw.c @@ -1,5 +1,6 @@ #include <stdio.h> -#include <stm32f4xx_hal.h> + +#include "stm32f4xx_hal.h" #include "misc.h" #include "mpconfig.h" @@ -27,16 +28,6 @@ // // pyb.switch(switch_pressed) -static mp_obj_t switch_user_callback_obj; - -static mp_obj_t switch_callback(mp_obj_t line) { - if (switch_user_callback_obj != mp_const_none) { - mp_call_function_0(switch_user_callback_obj); - } - return mp_const_none; -} -static MP_DEFINE_CONST_FUN_OBJ_1(switch_callback_obj, switch_callback); - // this function inits the switch GPIO so that it can be used void switch_init0(void) { GPIO_InitTypeDef init; @@ -47,34 +38,80 @@ void switch_init0(void) { HAL_GPIO_Init(MICROPY_HW_USRSW_PIN.gpio, &init); } -// this function inits the callback pointer -void switch_init(void) { - switch_user_callback_obj = mp_const_none; -} - int switch_get(void) { int val = ((MICROPY_HW_USRSW_PIN.gpio->IDR & MICROPY_HW_USRSW_PIN.pin_mask) != 0); return val == MICROPY_HW_USRSW_PRESSED; } /******************************************************************************/ -/* Micro Python bindings */ - -static mp_obj_t pyb_switch(uint n_args, mp_obj_t *args) { - if (n_args == 0) { - return switch_get() ? mp_const_true : mp_const_false; - } else { - switch_user_callback_obj = args[0]; - // Init the EXTI each time this function is called, since the EXTI - // may have been disabled by an exception in the interrupt, or the - // user disabling the line explicitly. - extint_register((mp_obj_t)&MICROPY_HW_USRSW_PIN, - MICROPY_HW_USRSW_EXTI_MODE, - MICROPY_HW_USRSW_PULL, - switch_user_callback_obj == mp_const_none ? mp_const_none : (mp_obj_t)&switch_callback_obj, - true, NULL); - return mp_const_none; +// Micro Python bindings + +typedef struct _pyb_switch_obj_t { + mp_obj_base_t base; + mp_obj_t callback; +} pyb_switch_obj_t; + +STATIC pyb_switch_obj_t pyb_switch_obj; + +void pyb_switch_print(void (*print)(void *env, const char *fmt, ...), void *env, mp_obj_t self_in, mp_print_kind_t kind) { + print(env, "Switch()"); +} + +STATIC mp_obj_t pyb_switch_make_new(mp_obj_t type_in, uint n_args, uint n_kw, const mp_obj_t *args) { + // check arguments + mp_arg_check_num(n_args, n_kw, 0, 0, false); + + // init the switch object + pyb_switch_obj.base.type = &pyb_switch_type; + + // No need to clear the callback member: if it's already been set and registered + // with extint then we don't want to reset that behaviour. If it hasn't been set, + // then no extint will be called until it is set via the callback method. + + // return static switch object + return (mp_obj_t)&pyb_switch_obj; +} + +mp_obj_t pyb_switch_call(mp_obj_t self_in, uint n_args, uint n_kw, const mp_obj_t *args) { + // get switch state + mp_arg_check_num(n_args, n_kw, 0, 0, false); + return switch_get() ? mp_const_true : mp_const_false; +} + +STATIC mp_obj_t switch_callback(mp_obj_t line) { + if (pyb_switch_obj.callback != mp_const_none) { + mp_call_function_0(pyb_switch_obj.callback); } + return mp_const_none; +} +STATIC MP_DEFINE_CONST_FUN_OBJ_1(switch_callback_obj, switch_callback); + +mp_obj_t pyb_switch_callback(mp_obj_t self_in, mp_obj_t callback) { + pyb_switch_obj_t *self = self_in; + self->callback = callback; + // Init the EXTI each time this function is called, since the EXTI + // may have been disabled by an exception in the interrupt, or the + // user disabling the line explicitly. + extint_register((mp_obj_t)&MICROPY_HW_USRSW_PIN, + MICROPY_HW_USRSW_EXTI_MODE, + MICROPY_HW_USRSW_PULL, + callback == mp_const_none ? mp_const_none : (mp_obj_t)&switch_callback_obj, + true, NULL); + return mp_const_none; } +STATIC MP_DEFINE_CONST_FUN_OBJ_2(pyb_switch_callback_obj, pyb_switch_callback); + +STATIC const mp_map_elem_t pyb_switch_locals_dict_table[] = { + { MP_OBJ_NEW_QSTR(MP_QSTR_callback), (mp_obj_t)&pyb_switch_callback_obj }, +}; + +STATIC MP_DEFINE_CONST_DICT(pyb_switch_locals_dict, pyb_switch_locals_dict_table); -MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(pyb_switch_obj, 0, 1, pyb_switch); +const mp_obj_type_t pyb_switch_type = { + { &mp_type_type }, + .name = MP_QSTR_Switch, + .print = pyb_switch_print, + .make_new = pyb_switch_make_new, + .call = pyb_switch_call, + .locals_dict = (mp_obj_t)&pyb_switch_locals_dict, +}; |