diff options
-rw-r--r-- | stmhal/main.c | 7 | ||||
-rw-r--r-- | stmhal/modpyb.c | 2 | ||||
-rw-r--r-- | stmhal/qstrdefsport.h | 6 | ||||
-rw-r--r-- | stmhal/usrsw.c | 103 | ||||
-rw-r--r-- | stmhal/usrsw.h | 3 |
5 files changed, 78 insertions, 43 deletions
diff --git a/stmhal/main.c b/stmhal/main.c index bb2a1d88a1..861e584d16 100644 --- a/stmhal/main.c +++ b/stmhal/main.c @@ -205,7 +205,9 @@ int main(void) { pendsv_init(); timer_tim3_init(); led_init(); +#if MICROPY_HW_HAS_SWITCH switch_init0(); +#endif int first_soft_reset = true; @@ -297,11 +299,6 @@ soft_reset: pin_init(); extint_init(); -#if MICROPY_HW_HAS_SWITCH - // must come after extint_init - switch_init(); -#endif - #if MICROPY_HW_HAS_LCD // LCD init (just creates class, init hardware by calling LCD()) lcd_init(); diff --git a/stmhal/modpyb.c b/stmhal/modpyb.c index 7bd7d5f994..7aec712510 100644 --- a/stmhal/modpyb.c +++ b/stmhal/modpyb.c @@ -295,7 +295,7 @@ STATIC const mp_map_elem_t pyb_module_globals_table[] = { #endif #if MICROPY_HW_HAS_SWITCH - { MP_OBJ_NEW_QSTR(MP_QSTR_switch), (mp_obj_t)&pyb_switch_obj }, + { MP_OBJ_NEW_QSTR(MP_QSTR_Switch), (mp_obj_t)&pyb_switch_type }, #endif #if MICROPY_HW_HAS_SDCARD diff --git a/stmhal/qstrdefsport.h b/stmhal/qstrdefsport.h index bb1e40d638..1d505bd688 100644 --- a/stmhal/qstrdefsport.h +++ b/stmhal/qstrdefsport.h @@ -20,8 +20,6 @@ Q(gc) Q(repl_info) Q(delay) Q(udelay) -Q(switch) -Q(SW) Q(servo) Q(pwm) Q(read) @@ -79,6 +77,10 @@ Q(off) Q(toggle) Q(intensity) +// for Switch class +Q(Switch) +Q(callback) + // for UART class Q(UART) Q(baudrate) 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, +}; diff --git a/stmhal/usrsw.h b/stmhal/usrsw.h index b1b838653f..f60147c540 100644 --- a/stmhal/usrsw.h +++ b/stmhal/usrsw.h @@ -1,5 +1,4 @@ void switch_init0(void); -void switch_init(void); int switch_get(void); -MP_DECLARE_CONST_FUN_OBJ(pyb_switch_obj); +extern const mp_obj_type_t pyb_switch_type; |