Skip to content

Commit 0a0f800

Browse files
committed
Merge remote-tracking branch 'origin/main' into main
2 parents 74a844d + f9f106b commit 0a0f800

File tree

6 files changed

+55
-0
lines changed

6 files changed

+55
-0
lines changed

locale/circuitpython.pot

Lines changed: 8 additions & 0 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 pins"
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 ""

ports/stm/boards/stm32f411ce_blackpill_with_flash/mpconfigboard.mk

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,3 +16,6 @@ MCU_PACKAGE = UFQFPN48
1616

1717
LD_COMMON = boards/common_default.ld
1818
LD_FILE = boards/STM32F411_nofs.ld
19+
20+
# Too big for the flash
21+
CIRCUITPY_ULAB = 0

shared-bindings/keypad/KeyMatrix.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,8 @@ 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_2(row_pins, column_pins, MP_QSTR_row_pins, MP_QSTR_column_pins);
94+
9395
for (size_t row = 0; row < num_row_pins; row++) {
9496
mcu_pin_obj_t *pin =
9597
validate_obj_is_free_pin(mp_obj_subscr(row_pins, MP_OBJ_NEW_SMALL_INT(row), MP_OBJ_SENTINEL));

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: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,45 @@ 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+
const size_t num_pins = (size_t)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 = (size_t)MP_OBJ_SMALL_INT_VALUE(mp_obj_len(seq1));
128+
const size_t num_pins_2 = (size_t)MP_OBJ_SMALL_INT_VALUE(mp_obj_len(seq2));
129+
130+
validate_no_duplicate_pins(seq1, arg_name1);
131+
validate_no_duplicate_pins(seq2, arg_name2);
132+
133+
for (size_t pin_cnt_1 = 0; pin_cnt_1 < num_pins_1; pin_cnt_1++) {
134+
mp_obj_t pin1_obj = mp_obj_subscr(seq1, MP_OBJ_NEW_SMALL_INT(pin_cnt_1), MP_OBJ_SENTINEL);
135+
mcu_pin_obj_t *pin1 = validate_obj_is_pin(pin1_obj);
136+
137+
for (size_t pin_cnt_2 = 0; pin_cnt_2 < num_pins_2; pin_cnt_2++) {
138+
mp_obj_t pin2_obj = mp_obj_subscr(seq2, MP_OBJ_NEW_SMALL_INT(pin_cnt_2), MP_OBJ_SENTINEL);
139+
mcu_pin_obj_t *pin2 = validate_obj_is_pin(pin2_obj);
140+
if (pin1 == pin2) {
141+
mp_raise_TypeError_varg(translate("%q and %q contain duplicate pins"), arg_name1, arg_name2);
142+
}
143+
}
144+
}
145+
}
146+
108147
// Validate every element in the list to be a free pin.
109148
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) {
110149
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)