Skip to content

Commit 651350a

Browse files
authored
Merge pull request adafruit#5360 from jepler/keypad-ticks
keypad: Event: add timestamp.
2 parents 844077b + 91223c8 commit 651350a

File tree

11 files changed

+77
-27
lines changed

11 files changed

+77
-27
lines changed

shared-bindings/keypad/Event.c

Lines changed: 34 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -29,32 +29,41 @@
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:Optional[int]=None) -> 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
//|
4345
STATIC 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
//|
144173
STATIC 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
};
170200
STATIC MP_DEFINE_CONST_DICT(keypad_event_locals_dict, keypad_event_locals_dict_table);
171201

shared-bindings/keypad/Event.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,9 +32,10 @@
3232

3333
extern const mp_obj_type_t keypad_event_type;
3434

35-
void common_hal_keypad_event_construct(keypad_event_obj_t *self, mp_uint_t key_number, bool pressed);
35+
void common_hal_keypad_event_construct(keypad_event_obj_t *self, mp_uint_t key_number, bool pressed, mp_obj_t timestamp);
3636
mp_int_t common_hal_keypad_event_get_key_number(keypad_event_obj_t *self);
3737
bool common_hal_keypad_event_get_pressed(keypad_event_obj_t *self);
3838
bool common_hal_keypad_event_get_released(keypad_event_obj_t *self);
39+
mp_obj_t common_hal_keypad_event_get_timestamp(keypad_event_obj_t *self);
3940

4041
#endif // MICROPY_INCLUDED_SHARED_BINDINGS_KEYPAD_EVENT__H

shared-bindings/supervisor/__init__.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -251,7 +251,7 @@ MP_DEFINE_CONST_FUN_OBJ_KW(supervisor_set_next_code_file_obj, 0, supervisor_set_
251251
//|
252252
//| """
253253
//| ...
254-
STATIC mp_obj_t supervisor_ticks_ms(void) {
254+
mp_obj_t supervisor_ticks_ms(void) {
255255
uint64_t ticks_ms = common_hal_time_monotonic_ms();
256256
return mp_obj_new_int((ticks_ms + 0x1fff0000) % (1 << 29));
257257
}

shared-bindings/supervisor/__init__.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@
3333
#include "common-hal/supervisor/Runtime.h"
3434

3535
extern const super_runtime_obj_t common_hal_supervisor_runtime_obj;
36-
36+
extern mp_obj_t supervisor_ticks_ms(void);
3737

3838

3939
#endif // MICROPY_INCLUDED_SHARED_BINDINGS_SUPERVISOR___INIT___H

shared-module/keypad/Event.c

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,10 +25,12 @@
2525
*/
2626

2727
#include "shared-module/keypad/Event.h"
28+
#include "shared-bindings/keypad/Event.h"
2829

29-
void common_hal_keypad_event_construct(keypad_event_obj_t *self, mp_int_t key_number, bool pressed) {
30+
void common_hal_keypad_event_construct(keypad_event_obj_t *self, mp_uint_t key_number, bool pressed, mp_obj_t timestamp) {
3031
self->key_number = key_number;
3132
self->pressed = pressed;
33+
self->timestamp = timestamp;
3234
}
3335

3436
mp_int_t common_hal_keypad_event_get_key_number(keypad_event_obj_t *self) {
@@ -42,3 +44,7 @@ bool common_hal_keypad_event_get_pressed(keypad_event_obj_t *self) {
4244
bool common_hal_keypad_event_get_released(keypad_event_obj_t *self) {
4345
return !self->pressed;
4446
}
47+
48+
mp_obj_t common_hal_keypad_event_get_timestamp(keypad_event_obj_t *self) {
49+
return self->timestamp;
50+
}

shared-module/keypad/Event.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ typedef struct {
3333
mp_obj_base_t base;
3434
uint16_t key_number;
3535
bool pressed;
36+
mp_obj_t timestamp;
3637
} keypad_event_obj_t;
3738

3839

shared-module/keypad/EventQueue.c

Lines changed: 18 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
*/
2626

2727
#include "shared-bindings/keypad/Event.h"
28+
#include "shared-bindings/supervisor/__init__.h"
2829
#include "shared-module/keypad/EventQueue.h"
2930

3031
// Key number is lower 15 bits of a 16-bit value.
@@ -33,33 +34,34 @@
3334

3435
void common_hal_keypad_eventqueue_construct(keypad_eventqueue_obj_t *self, size_t max_events) {
3536
// Event queue is 16-bit values.
36-
ringbuf_alloc(&self->encoded_events, max_events * 2, false);
37+
ringbuf_alloc(&self->encoded_events, max_events * (sizeof(uint16_t) + sizeof(mp_obj_t)), false);
3738
self->overflowed = false;
3839
}
3940

40-
mp_obj_t common_hal_keypad_eventqueue_get(keypad_eventqueue_obj_t *self) {
41-
int encoded_event = ringbuf_get16(&self->encoded_events);
42-
if (encoded_event == -1) {
43-
return MP_ROM_NONE;
44-
}
45-
46-
keypad_event_obj_t *event = m_new_obj(keypad_event_obj_t);
47-
event->base.type = &keypad_event_type;
48-
common_hal_keypad_event_construct(event, encoded_event & EVENT_KEY_NUM_MASK, encoded_event & EVENT_PRESSED);
49-
return MP_OBJ_FROM_PTR(event);
50-
}
51-
5241
bool common_hal_keypad_eventqueue_get_into(keypad_eventqueue_obj_t *self, keypad_event_obj_t *event) {
5342
int encoded_event = ringbuf_get16(&self->encoded_events);
5443
if (encoded_event == -1) {
5544
return false;
5645
}
5746

47+
mp_obj_t ticks;
48+
ringbuf_get_n(&self->encoded_events, (uint8_t *)&ticks, sizeof(ticks));
5849
// "Construct" using the existing event.
59-
common_hal_keypad_event_construct(event, encoded_event & EVENT_KEY_NUM_MASK, encoded_event & EVENT_PRESSED);
50+
common_hal_keypad_event_construct(event, encoded_event & EVENT_KEY_NUM_MASK, encoded_event & EVENT_PRESSED, ticks);
6051
return true;
6152
}
6253

54+
mp_obj_t common_hal_keypad_eventqueue_get(keypad_eventqueue_obj_t *self) {
55+
keypad_event_obj_t *event = m_new_obj(keypad_event_obj_t);
56+
event->base.type = &keypad_event_type;
57+
bool result = common_hal_keypad_eventqueue_get_into(self, event);
58+
if (result) {
59+
return event;
60+
}
61+
m_free(event);
62+
return MP_ROM_NONE;
63+
}
64+
6365
bool common_hal_keypad_eventqueue_get_overflowed(keypad_eventqueue_obj_t *self) {
6466
return self->overflowed;
6567
}
@@ -77,7 +79,7 @@ size_t common_hal_keypad_eventqueue_get_length(keypad_eventqueue_obj_t *self) {
7779
return ringbuf_num_filled(&self->encoded_events);
7880
}
7981

80-
bool keypad_eventqueue_record(keypad_eventqueue_obj_t *self, mp_uint_t key_number, bool pressed) {
82+
bool keypad_eventqueue_record(keypad_eventqueue_obj_t *self, mp_uint_t key_number, bool pressed, mp_obj_t timestamp) {
8183
if (ringbuf_num_empty(&self->encoded_events) == 0) {
8284
// Queue is full. Set the overflow flag. The caller will decide what else to do.
8385
common_hal_keypad_eventqueue_set_overflowed(self, true);
@@ -89,6 +91,7 @@ bool keypad_eventqueue_record(keypad_eventqueue_obj_t *self, mp_uint_t key_numbe
8991
encoded_event |= EVENT_PRESSED;
9092
}
9193
ringbuf_put16(&self->encoded_events, encoded_event);
94+
ringbuf_put_n(&self->encoded_events, (uint8_t *)&timestamp, sizeof(mp_obj_t));
9295

9396
return true;
9497
}

shared-module/keypad/EventQueue.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,6 @@ typedef struct {
3636
bool overflowed;
3737
} keypad_eventqueue_obj_t;
3838

39-
bool keypad_eventqueue_record(keypad_eventqueue_obj_t *self, mp_uint_t key_number, bool pressed);
39+
bool keypad_eventqueue_record(keypad_eventqueue_obj_t *self, mp_uint_t key_number, bool pressed, mp_obj_t timestamp);
4040

4141
#endif // MICROPY_INCLUDED_SHARED_MODULE_KEYPAD_EVENTQUEUE_H

shared-module/keypad/KeyMatrix.c

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
#include "shared-bindings/keypad/EventQueue.h"
3333
#include "shared-bindings/keypad/KeyMatrix.h"
3434
#include "shared-bindings/keypad/__init__.h"
35+
#include "shared-bindings/supervisor/__init__.h"
3536
#include "shared-bindings/util.h"
3637
#include "supervisor/port.h"
3738
#include "supervisor/shared/tick.h"
@@ -146,6 +147,8 @@ void keypad_keymatrix_scan(keypad_keymatrix_obj_t *self) {
146147

147148
self->last_scan_ticks = now;
148149

150+
mp_obj_t timestamp = supervisor_ticks_ms();
151+
149152
// On entry, all pins are set to inputs with a pull-up or pull-down,
150153
// depending on the diode orientation.
151154
for (size_t row = 0; row < common_hal_keypad_keymatrix_get_row_count(self); row++) {
@@ -170,7 +173,7 @@ void keypad_keymatrix_scan(keypad_keymatrix_obj_t *self) {
170173

171174
// Record any transitions.
172175
if (previous != current) {
173-
keypad_eventqueue_record(self->events, key_number, current);
176+
keypad_eventqueue_record(self->events, key_number, current, timestamp);
174177
}
175178
}
176179

shared-module/keypad/Keys.c

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
#include "shared-bindings/keypad/EventQueue.h"
3333
#include "shared-bindings/keypad/Keys.h"
3434
#include "shared-bindings/keypad/__init__.h"
35+
#include "shared-bindings/supervisor/__init__.h"
3536
#include "supervisor/port.h"
3637
#include "supervisor/shared/tick.h"
3738

@@ -112,6 +113,8 @@ void keypad_keys_scan(keypad_keys_obj_t *self) {
112113

113114
const size_t key_count = common_hal_keypad_keys_get_key_count(self);
114115

116+
mp_obj_t timestamp = supervisor_ticks_ms();
117+
115118
for (mp_uint_t key_number = 0; key_number < key_count; key_number++) {
116119
// Remember the previous up/down state.
117120
const bool previous = self->currently_pressed[key_number];
@@ -125,7 +128,7 @@ void keypad_keys_scan(keypad_keys_obj_t *self) {
125128

126129
// Record any transitions.
127130
if (previous != current) {
128-
keypad_eventqueue_record(self->events, key_number, current);
131+
keypad_eventqueue_record(self->events, key_number, current, timestamp);
129132
}
130133
}
131134
}

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy