25
25
*/
26
26
27
27
#include "lib/utils/context_manager_helpers.h"
28
+ #include "py/binary.h"
28
29
#include "py/objproperty.h"
29
30
#include "py/runtime.h"
30
31
#include "shared-bindings/keypad/Event.h"
@@ -136,6 +137,47 @@ STATIC void check_for_deinit(keypad_keymatrix_obj_t *self) {
136
137
}
137
138
}
138
139
140
+ //| num_keys: int
141
+ //| """The number of keys that are being scanned. (read-only)
142
+ //| """
143
+ //|
144
+ STATIC mp_obj_t keypad_keymatrix_get_num_keys (mp_obj_t self_in ) {
145
+ keypad_keymatrix_obj_t * self = MP_OBJ_TO_PTR (self_in );
146
+ return MP_OBJ_NEW_SMALL_INT (common_hal_keypad_keymatrix_get_num_keys (self ));
147
+ }
148
+ MP_DEFINE_CONST_FUN_OBJ_1 (keypad_keymatrix_get_num_keys_obj , keypad_keymatrix_get_num_keys );
149
+
150
+ const mp_obj_property_t keypad_keymatrix_num_keys_obj = {
151
+ .base .type = & mp_type_property ,
152
+ .proxy = {(mp_obj_t )& keypad_keymatrix_get_num_keys_obj ,
153
+ MP_ROM_NONE ,
154
+ MP_ROM_NONE },
155
+ };
156
+
157
+ //| def key_num(self, row: int, col: int) -> int:
158
+ //| """Return the key number for a given row and column.
159
+ //| The key number is calculated by ``row * len(col_pins) + col``.
160
+ //| """
161
+ //| ...
162
+ //|
163
+ STATIC mp_obj_t keypad_keymatrix_key_num (mp_obj_t self_in , mp_obj_t row_in , mp_obj_t col_in ) {
164
+ keypad_keymatrix_obj_t * self = MP_OBJ_TO_PTR (self_in );
165
+ check_for_deinit (self );
166
+
167
+ const mp_int_t row = mp_obj_get_int (row_in );
168
+ if (row < 0 || (size_t )row >= common_hal_keypad_keymatrix_get_num_rows (self )) {
169
+ mp_raise_ValueError_varg (translate ("%q out of range" ), MP_QSTR_row_num );
170
+ }
171
+
172
+ const mp_int_t col = mp_obj_get_int (col_in );
173
+ if (col < 0 || (size_t )col >= common_hal_keypad_keymatrix_get_num_cols (self )) {
174
+ mp_raise_ValueError_varg (translate ("%q out of range" ), MP_QSTR_col_num );
175
+ }
176
+
177
+ return MP_OBJ_NEW_SMALL_INT (
178
+ (mp_int_t )common_hal_keypad_keymatrix_key_num (self , (mp_uint_t )row , (mp_uint_t )col ));
179
+ }
180
+ MP_DEFINE_CONST_FUN_OBJ_3 (keypad_keymatrix_key_num_obj , keypad_keymatrix_key_num );
139
181
140
182
//| def pressed(self, key_num: int) -> None:
141
183
//| """Return ``True`` if the given key is pressed. This is a debounced read
@@ -148,38 +190,40 @@ STATIC mp_obj_t keypad_keymatrix_pressed(mp_obj_t self_in, mp_obj_t key_num_in)
148
190
check_for_deinit (self );
149
191
150
192
mp_int_t key_num = mp_obj_get_int (key_num_in );
151
- if (key_num < 0 || (size_t )key_num >= common_hal_keypad_keymatrix_num_keys (self )) {
193
+ if (key_num < 0 || (size_t )key_num >= common_hal_keypad_keymatrix_get_num_keys (self )) {
152
194
mp_raise_ValueError_varg (translate ("%q out of range" ), MP_QSTR_key_num );
153
195
}
154
196
155
197
return mp_obj_new_bool (common_hal_keypad_keymatrix_pressed (self , (mp_uint_t )key_num ));
156
198
}
157
199
MP_DEFINE_CONST_FUN_OBJ_2 (keypad_keymatrix_pressed_obj , keypad_keymatrix_pressed );
158
200
159
- //| def key_num(self, row: int, col: int) -> int:
160
- //| """Return the key number for a given row and column.
161
- //| The key number is calculated by ``row * len(col_pins) + col``.
201
+ //| def store_states(self, states: _typing.WriteableBuffer) -> None:
202
+ //| """Write the state of all the keys into ``states``.
203
+ //| Write a ``1`` if pressed, and ``0`` if released.
204
+ //| The ``length`` of ``states`` must be `num_keys`.
205
+ //| This is a debounced read of the state of all the keys, and bypasses the `events` `EventQueue`.
206
+ //| The read is done atomically.
162
207
//| """
163
208
//| ...
164
209
//|
165
- STATIC mp_obj_t keypad_keymatrix_key_num (mp_obj_t self_in , mp_obj_t row_in , mp_obj_t col_in ) {
210
+ STATIC mp_obj_t keypad_keymatrix_store_states (mp_obj_t self_in , mp_obj_t pressed ) {
166
211
keypad_keymatrix_obj_t * self = MP_OBJ_TO_PTR (self_in );
167
212
check_for_deinit (self );
168
213
169
- const mp_int_t row = mp_obj_get_int (row_in );
170
- if (row < 0 || (size_t )row >= common_hal_keypad_keymatrix_num_rows (self )) {
171
- mp_raise_ValueError_varg (translate ("%q out of range" ), MP_QSTR_row_num );
214
+ mp_buffer_info_t bufinfo ;
215
+ mp_get_buffer_raise (pressed , & bufinfo , MP_BUFFER_WRITE );
216
+ if (bufinfo .typecode != 'b' && bufinfo .typecode != 'B' && bufinfo .typecode != BYTEARRAY_TYPECODE ) {
217
+ mp_raise_ValueError_varg (translate ("%q must store bytes" ), MP_QSTR_states );
172
218
}
173
-
174
- const mp_int_t col = mp_obj_get_int (col_in );
175
- if (col < 0 || (size_t )col >= common_hal_keypad_keymatrix_num_cols (self )) {
176
- mp_raise_ValueError_varg (translate ("%q out of range" ), MP_QSTR_col_num );
219
+ if (bufinfo .len != common_hal_keypad_keymatrix_get_num_keys (self )) {
220
+ mp_raise_ValueError_varg (translate ("%q length must be %q" ), MP_QSTR_states , MP_QSTR_num_keys );
177
221
}
178
222
179
- return MP_OBJ_NEW_SMALL_INT (
180
- ( mp_int_t ) common_hal_keypad_keymatrix_key_num ( self , ( mp_uint_t ) row , ( mp_uint_t ) col )) ;
223
+ common_hal_keypad_keymatrix_store_states ( self , ( uint8_t * ) bufinfo . buf );
224
+ return MP_ROM_NONE ;
181
225
}
182
- MP_DEFINE_CONST_FUN_OBJ_3 ( keypad_keymatrix_key_num_obj , keypad_keymatrix_key_num );
226
+ MP_DEFINE_CONST_FUN_OBJ_2 ( keypad_keymatrix_store_states_obj , keypad_keymatrix_store_states );
183
227
184
228
//| events: EventQueue
185
229
//| """The `EventQueue` associated with this `Keys` object. (read-only)
@@ -199,13 +243,15 @@ const mp_obj_property_t keypad_keymatrix_events_obj = {
199
243
};
200
244
201
245
STATIC const mp_rom_map_elem_t keypad_keymatrix_locals_dict_table [] = {
202
- { MP_ROM_QSTR (MP_QSTR_deinit ), MP_ROM_PTR (& keypad_keymatrix_deinit_obj ) },
203
- { MP_ROM_QSTR (MP_QSTR___enter__ ), MP_ROM_PTR (& default___enter___obj ) },
204
- { MP_ROM_QSTR (MP_QSTR___exit__ ), MP_ROM_PTR (& keypad_keymatrix___exit___obj ) },
246
+ { MP_ROM_QSTR (MP_QSTR_deinit ), MP_ROM_PTR (& keypad_keymatrix_deinit_obj ) },
247
+ { MP_ROM_QSTR (MP_QSTR___enter__ ), MP_ROM_PTR (& default___enter___obj ) },
248
+ { MP_ROM_QSTR (MP_QSTR___exit__ ), MP_ROM_PTR (& keypad_keymatrix___exit___obj ) },
205
249
206
250
{ MP_ROM_QSTR (MP_QSTR_events ), MP_ROM_PTR (& keypad_keymatrix_events_obj ) },
207
251
{ MP_ROM_QSTR (MP_QSTR_key_num ), MP_ROM_PTR (& keypad_keymatrix_key_num_obj ) },
252
+ { MP_ROM_QSTR (MP_QSTR_num_keys ), MP_ROM_PTR (& keypad_keymatrix_num_keys_obj ) },
208
253
{ MP_ROM_QSTR (MP_QSTR_pressed ), MP_ROM_PTR (& keypad_keymatrix_pressed_obj ) },
254
+ { MP_ROM_QSTR (MP_QSTR_store_states ), MP_ROM_PTR (& keypad_keymatrix_store_states_obj ) },
209
255
};
210
256
211
257
STATIC MP_DEFINE_CONST_DICT (keypad_keymatrix_locals_dict , keypad_keymatrix_locals_dict_table );
0 commit comments