6262//| key_count: Union[int, Sequence[int]],
6363//| value_when_pressed: bool,
6464//| interval: float = 0.020,
65- //| max_events: int = 64
65+ //| max_events: int = 64,
66+ //| debounce_threshold: int = 1,
6667//| ) -> None:
6768//| """
6869//| Create a `Keys` object that will scan keys attached to a parallel-in serial-out shift register
9596//| maximum number of key transition events that are saved.
9697//| Must be >= 1.
9798//| If a new event arrives when the queue is full, the oldest event is discarded.
99+ //| :param int debounce_threshold: Emit events for state changes only after a key has been
100+ //| in the respective state for ``debounce_threshold`` times on average.
101+ //| Successive measurements are spaced apart by ``interval`` seconds.
102+ //| The default is 1, which resolves immediately. The maximum is 127.
98103//| """
99104//| ...
100105
101106STATIC mp_obj_t keypad_shiftregisterkeys_make_new (const mp_obj_type_t * type , size_t n_args , size_t n_kw , const mp_obj_t * all_args ) {
102107 #if CIRCUITPY_KEYPAD_SHIFTREGISTERKEYS
103108 keypad_shiftregisterkeys_obj_t * self =
104109 mp_obj_malloc (keypad_shiftregisterkeys_obj_t , & keypad_shiftregisterkeys_type );
105- enum { ARG_clock , ARG_data , ARG_latch , ARG_value_to_latch , ARG_key_count , ARG_value_when_pressed , ARG_interval , ARG_max_events };
110+ enum { ARG_clock , ARG_data , ARG_latch , ARG_value_to_latch , ARG_key_count , ARG_value_when_pressed , ARG_interval , ARG_max_events , ARG_debounce_threshold };
106111 static const mp_arg_t allowed_args [] = {
107112 { MP_QSTR_clock , MP_ARG_KW_ONLY | MP_ARG_REQUIRED | MP_ARG_OBJ },
108113 { MP_QSTR_data , MP_ARG_KW_ONLY | MP_ARG_REQUIRED | MP_ARG_OBJ },
@@ -112,6 +117,7 @@ STATIC mp_obj_t keypad_shiftregisterkeys_make_new(const mp_obj_type_t *type, siz
112117 { MP_QSTR_value_when_pressed , MP_ARG_REQUIRED | MP_ARG_KW_ONLY | MP_ARG_BOOL },
113118 { MP_QSTR_interval , MP_ARG_KW_ONLY | MP_ARG_OBJ , {.u_obj = MP_OBJ_NULL } },
114119 { MP_QSTR_max_events , MP_ARG_KW_ONLY | MP_ARG_INT , {.u_int = 64 } },
120+ { MP_QSTR_debounce_threshold , MP_ARG_KW_ONLY | MP_ARG_INT , {.u_int = 1 } },
115121 };
116122 mp_arg_val_t args [MP_ARRAY_SIZE (allowed_args )];
117123 mp_arg_parse_all_kw_array (n_args , n_kw , all_args , MP_ARRAY_SIZE (allowed_args ), allowed_args , args );
@@ -168,9 +174,10 @@ STATIC mp_obj_t keypad_shiftregisterkeys_make_new(const mp_obj_type_t *type, siz
168174 const mp_float_t interval =
169175 mp_arg_validate_obj_float_non_negative (args [ARG_interval ].u_obj , 0.020f , MP_QSTR_interval );
170176 const size_t max_events = (size_t )mp_arg_validate_int_min (args [ARG_max_events ].u_int , 1 , MP_QSTR_max_events );
177+ const uint8_t debounce_threshold = (uint8_t )mp_arg_validate_int_range (args [ARG_debounce_threshold ].u_int , 1 , 127 , MP_QSTR_debounce_threshold );
171178
172179 common_hal_keypad_shiftregisterkeys_construct (
173- self , clock , num_data_pins , data_pins_array , latch , value_to_latch , num_key_counts , key_count_array , value_when_pressed , interval , max_events );
180+ self , clock , num_data_pins , data_pins_array , latch , value_to_latch , num_key_counts , key_count_array , value_when_pressed , interval , max_events , debounce_threshold );
174181
175182 return MP_OBJ_FROM_PTR (self );
176183
0 commit comments