Skip to content

Commit 168ed35

Browse files
committed
Made check function generic
1 parent e18ceea commit 168ed35

File tree

5 files changed

+50
-26
lines changed

5 files changed

+50
-26
lines changed

locale/circuitpython.pot

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,14 @@ msgid ""
6666
"%d address pins, %d rgb pins and %d tiles indicate a height of %d, not %d"
6767
msgstr ""
6868

69+
#: shared-bindings/microcontroller/Pin.c
70+
msgid "%q and %q contain duplicate objects"
71+
msgstr ""
72+
73+
#: shared-bindings/microcontroller/Pin.c
74+
msgid "%q contains duplicate pins"
75+
msgstr ""
76+
6977
#: ports/atmel-samd/common-hal/sdioio/SDCard.c
7078
msgid "%q failure: %d"
7179
msgstr ""
@@ -1998,10 +2006,6 @@ msgstr ""
19982006
msgid "Row entry must be digitalio.DigitalInOut"
19992007
msgstr ""
20002008

2001-
#: shared-bindings/keypad/KeyMatrix.c
2002-
msgid "Row or Column pin duplicated"
2003-
msgstr ""
2004-
20052009
#: main.c
20062010
msgid "Running in safe mode! Not running saved code.\n"
20072011
msgstr ""

shared-bindings/keypad/KeyMatrix.c

Lines changed: 4 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,10 @@ STATIC mp_obj_t keypad_keymatrix_make_new(const mp_obj_type_t *type, size_t n_ar
9090
mcu_pin_obj_t *row_pins_array[num_row_pins];
9191
mcu_pin_obj_t *column_pins_array[num_column_pins];
9292

93+
validate_no_duplicate_pins(row_pins, MP_QSTR_row_pins);
94+
validate_no_duplicate_pins(column_pins, MP_QSTR_column_pins);
95+
validate_no_duplicate_pins_2(row_pins, column_pins, MP_QSTR_row_pins, MP_QSTR_column_pins);
96+
9397
for (size_t row = 0; row < num_row_pins; row++) {
9498
mcu_pin_obj_t *pin =
9599
validate_obj_is_free_pin(mp_obj_subscr(row_pins, MP_OBJ_NEW_SMALL_INT(row), MP_OBJ_SENTINEL));
@@ -102,28 +106,6 @@ STATIC mp_obj_t keypad_keymatrix_make_new(const mp_obj_type_t *type, size_t n_ar
102106
column_pins_array[column] = pin;
103107
}
104108

105-
for (size_t row = 0; row < num_row_pins; row++) {
106-
for (size_t row2 = row + 1; row2 < num_row_pins; row2++) {
107-
if (row_pins_array[row] == row_pins_array[row2]) {
108-
mp_raise_ValueError(translate("Row or Column pin duplicated"));
109-
}
110-
}
111-
112-
for (size_t column = 0; column < num_column_pins; column++) {
113-
if (row_pins_array[row] == column_pins_array[column]) {
114-
mp_raise_ValueError(translate("Row or Column pin duplicated"));
115-
}
116-
}
117-
}
118-
119-
for (size_t column = 0; column < num_column_pins; column++) {
120-
for (size_t column2 = column + 1; column2 < num_column_pins; column2++) {
121-
if (column_pins_array[column] == column_pins_array[column2]) {
122-
mp_raise_ValueError(translate("Row or Column pin duplicated"));
123-
}
124-
}
125-
}
126-
127109
common_hal_keypad_keymatrix_construct(self, num_row_pins, row_pins_array, num_column_pins, column_pins_array, args[ARG_columns_to_anodes].u_bool, interval, max_events);
128110
return MP_OBJ_FROM_PTR(self);
129111
}

shared-bindings/keypad/Keys.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,7 @@ STATIC mp_obj_t keypad_keys_make_new(const mp_obj_type_t *type, size_t n_args, c
7878
mp_arg_parse_all(n_args, pos_args, kw_args, MP_ARRAY_SIZE(allowed_args), allowed_args, args);
7979

8080
mp_obj_t pins = args[ARG_pins].u_obj;
81+
validate_no_duplicate_pins(pins, MP_QSTR_row_pins);
8182
// mp_obj_len() will be >= 0.
8283
const size_t num_pins = (size_t)MP_OBJ_SMALL_INT_VALUE(mp_obj_len(pins));
8384

shared-bindings/microcontroller/Pin.c

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,41 @@ mcu_pin_obj_t *validate_obj_is_free_pin(mp_obj_t obj) {
105105
return pin;
106106
}
107107

108+
// Validate every element in the list is a unique pin
109+
void validate_no_duplicate_pins(mp_obj_t seq, qstr arg_name) {
110+
mp_int_t num_pins = MP_OBJ_SMALL_INT_VALUE(mp_obj_len(seq));
111+
112+
for (size_t pin_cnt = 0; pin_cnt < num_pins; pin_cnt++) {
113+
mp_obj_t pin1_obj = mp_obj_subscr(seq, MP_OBJ_NEW_SMALL_INT(pin_cnt), MP_OBJ_SENTINEL);
114+
mcu_pin_obj_t *pin1 = validate_obj_is_pin(pin1_obj);
115+
116+
for (size_t pin_cnt_2 = pin_cnt + 1; pin_cnt_2 < num_pins; pin_cnt_2++) {
117+
mp_obj_t pin2_obj = mp_obj_subscr(seq, MP_OBJ_NEW_SMALL_INT(pin_cnt_2), MP_OBJ_SENTINEL);
118+
mcu_pin_obj_t *pin2 = validate_obj_is_pin(pin2_obj);
119+
if (pin1 == pin2) {
120+
mp_raise_TypeError_varg(translate("%q contains duplicate pins"), arg_name);
121+
}
122+
}
123+
}
124+
}
125+
126+
void validate_no_duplicate_pins_2(mp_obj_t seq1, mp_obj_t seq2, qstr arg_name1, qstr arg_name2) {
127+
const size_t num_pins_1 = MP_OBJ_SMALL_INT_VALUE(mp_obj_len(seq1));
128+
const size_t num_pins_2 = MP_OBJ_SMALL_INT_VALUE(mp_obj_len(seq2));
129+
130+
for (size_t pin_cnt_1 = 0; pin_cnt_1 < num_pins_1; pin_cnt_1++) {
131+
mp_obj_t pin1_obj = mp_obj_subscr(seq1, MP_OBJ_NEW_SMALL_INT(pin_cnt_1), MP_OBJ_SENTINEL);
132+
mcu_pin_obj_t *pin1 = validate_obj_is_pin(pin1_obj);
133+
134+
for (size_t pin_cnt_2 = 0; pin_cnt_2 < num_pins_2; pin_cnt_2++) {
135+
mp_obj_t pin2_obj = mp_obj_subscr(seq2, MP_OBJ_NEW_SMALL_INT(pin_cnt_2), MP_OBJ_SENTINEL);
136+
if (pin1_obj == pin2_obj) {
137+
mp_raise_TypeError_varg(translate("%q and %q contain duplicate objects"), arg_name1, arg_name2);
138+
}
139+
}
140+
}
141+
}
142+
108143
// Validate every element in the list to be a free pin.
109144
void validate_list_is_free_pins(qstr what, mcu_pin_obj_t **pins_out, mp_int_t max_pins, mp_obj_t seq, uint8_t *count_out) {
110145
mp_int_t len = MP_OBJ_SMALL_INT_VALUE(mp_obj_len(seq));

shared-bindings/microcontroller/Pin.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,8 @@ mcu_pin_obj_t *validate_obj_is_pin(mp_obj_t obj);
3737
mcu_pin_obj_t *validate_obj_is_pin_or_none(mp_obj_t obj);
3838
mcu_pin_obj_t *validate_obj_is_free_pin(mp_obj_t obj);
3939
mcu_pin_obj_t *validate_obj_is_free_pin_or_none(mp_obj_t obj);
40+
void validate_no_duplicate_pins(mp_obj_t seq, qstr arg_name);
41+
void validate_no_duplicate_pins_2(mp_obj_t seq1, mp_obj_t seq2, qstr arg_name1, qstr arg_name2);
4042
void validate_list_is_free_pins(qstr what, mcu_pin_obj_t **pins_out, mp_int_t max_pins, mp_obj_t seq, uint8_t *count_out);
4143
void validate_pins(qstr what, uint8_t *pin_nos, mp_int_t max_pins, mp_obj_t seq, uint8_t *count_out);
4244

0 commit comments

Comments
 (0)