2929#include "py/runtime.h"
3030
3131#include "shared-bindings/keypad/Event.h"
32+ #include "shared-bindings/supervisor/__init__.h"
3233
3334//| class Event:
3435//| """A key transition event."""
35- //| def __init__(self, key_number: int=0, pressed: bool=True) -> None:
36+ //| def __init__(self, key_number: int=0, pressed: bool=True, timestamp:int=-1 ) -> None:
3637//| """Create a key transition event, which reports a key-pressed or key-released transition.
3738//|
3839//| :param int key_number: the key number
3940//| :param bool pressed: ``True`` if the key was pressed; ``False`` if it was released.
41+ //| :param int timestamp: The time in milliseconds that the keypress occurred in the `supervisor.ticks_ms` time system. If specified as None, the current value of `supervisor.ticks_ms` is used.
4042//| """
4143//| ...
4244//|
4345STATIC mp_obj_t keypad_event_make_new (const mp_obj_type_t * type , size_t n_args , const mp_obj_t * pos_args , mp_map_t * kw_args ) {
4446 keypad_event_obj_t * self = m_new_obj (keypad_event_obj_t );
4547 self -> base .type = & keypad_event_type ;
46- enum { ARG_key_number , ARG_pressed };
48+ enum { ARG_key_number , ARG_pressed , ARG_timestamp };
4749 static const mp_arg_t allowed_args [] = {
4850 { MP_QSTR_key_number , MP_ARG_INT , {.u_int = 0 } },
4951 { MP_QSTR_pressed , MP_ARG_BOOL , {.u_bool = true} },
52+ { MP_QSTR_timestamp , MP_ARG_OBJ , {.u_obj = mp_const_none } },
5053 };
5154 mp_arg_val_t args [MP_ARRAY_SIZE (allowed_args )];
5255 mp_arg_parse_all (n_args , pos_args , kw_args , MP_ARRAY_SIZE (allowed_args ), allowed_args , args );
5356
5457 const mp_uint_t key_number =
5558 (mp_uint_t )mp_arg_validate_int_min (args [ARG_key_number ].u_int , 0 , MP_QSTR_key_number );
5659
57- common_hal_keypad_event_construct (self , key_number , args [ARG_pressed ].u_bool );
60+ mp_obj_t timestamp = args [ARG_timestamp ].u_obj ;
61+ if (timestamp == mp_const_none ) {
62+ timestamp = supervisor_ticks_ms ();
63+ }
64+
65+ (void )mp_obj_get_int_truncated (timestamp ); // ensure that timesamp is an integer
66+ common_hal_keypad_event_construct (self , key_number , args [ARG_pressed ].u_bool , timestamp );
5867 return MP_OBJ_FROM_PTR (self );
5968}
6069
@@ -110,9 +119,27 @@ const mp_obj_property_t keypad_event_released_obj = {
110119 MP_ROM_NONE },
111120};
112121
122+ //| timestamp: int
123+ //| """The timestamp"""
124+ //|
125+ STATIC mp_obj_t keypad_event_get_timestamp (mp_obj_t self_in ) {
126+ keypad_event_obj_t * self = MP_OBJ_TO_PTR (self_in );
127+ return common_hal_keypad_event_get_timestamp (self );
128+ }
129+ MP_DEFINE_CONST_FUN_OBJ_1 (keypad_event_get_timestamp_obj , keypad_event_get_timestamp );
130+
131+ const mp_obj_property_t keypad_event_timestamp_obj = {
132+ .base .type = & mp_type_property ,
133+ .proxy = {(mp_obj_t )& keypad_event_get_timestamp_obj ,
134+ MP_ROM_NONE ,
135+ MP_ROM_NONE },
136+ };
137+
138+
113139//| def __eq__(self, other: object) -> bool:
114140//| """Two `Event` objects are equal if their `key_number`
115141//| and `pressed`/`released` values are equal.
142+ //| Note that this does not compare the event timestamps.
116143//| """
117144//| ...
118145//|
@@ -138,7 +165,9 @@ STATIC mp_obj_t keypad_event_binary_op(mp_binary_op_t op, mp_obj_t lhs_in, mp_ob
138165}
139166
140167//| def __hash__(self) -> int:
141- //| """Returns a hash for the `Event`, so it can be used in dictionaries, etc.."""
168+ //| """Returns a hash for the `Event`, so it can be used in dictionaries, etc..
169+ //|
170+ //| Note that as events with different timestamps compare equal, they also hash to the same value."""
142171//| ...
143172//|
144173STATIC mp_obj_t keypad_event_unary_op (mp_unary_op_t op , mp_obj_t self_in ) {
@@ -166,6 +195,7 @@ STATIC const mp_rom_map_elem_t keypad_event_locals_dict_table[] = {
166195 { MP_ROM_QSTR (MP_QSTR_key_number ), MP_ROM_PTR (& keypad_event_key_number_obj ) },
167196 { MP_ROM_QSTR (MP_QSTR_pressed ), MP_ROM_PTR (& keypad_event_pressed_obj ) },
168197 { MP_ROM_QSTR (MP_QSTR_released ), MP_ROM_PTR (& keypad_event_released_obj ) },
198+ { MP_ROM_QSTR (MP_QSTR_timestamp ), MP_ROM_PTR (& keypad_event_timestamp_obj ) },
169199};
170200STATIC MP_DEFINE_CONST_DICT (keypad_event_locals_dict , keypad_event_locals_dict_table );
171201
0 commit comments