From e18ceea9ba2dd628bebb7463b47b1dc5cc57783c Mon Sep 17 00:00:00 2001 From: gamblor21 Date: Tue, 10 Aug 2021 18:18:21 -0500 Subject: [PATCH 1/5] Check for duplicate pins in rows and columns --- locale/circuitpython.pot | 4 ++++ shared-bindings/keypad/KeyMatrix.c | 22 ++++++++++++++++++++++ 2 files changed, 26 insertions(+) diff --git a/locale/circuitpython.pot b/locale/circuitpython.pot index 67683abfdc..8fee3982a6 100644 --- a/locale/circuitpython.pot +++ b/locale/circuitpython.pot @@ -1998,6 +1998,10 @@ msgstr "" msgid "Row entry must be digitalio.DigitalInOut" msgstr "" +#: shared-bindings/keypad/KeyMatrix.c +msgid "Row or Column pin duplicated" +msgstr "" + #: main.c msgid "Running in safe mode! Not running saved code.\n" msgstr "" diff --git a/shared-bindings/keypad/KeyMatrix.c b/shared-bindings/keypad/KeyMatrix.c index 0b854ef475..eb87d2bd22 100644 --- a/shared-bindings/keypad/KeyMatrix.c +++ b/shared-bindings/keypad/KeyMatrix.c @@ -102,6 +102,28 @@ STATIC mp_obj_t keypad_keymatrix_make_new(const mp_obj_type_t *type, size_t n_ar column_pins_array[column] = pin; } + for (size_t row = 0; row < num_row_pins; row++) { + for (size_t row2 = row + 1; row2 < num_row_pins; row2++) { + if (row_pins_array[row] == row_pins_array[row2]) { + mp_raise_ValueError(translate("Row or Column pin duplicated")); + } + } + + for (size_t column = 0; column < num_column_pins; column++) { + if (row_pins_array[row] == column_pins_array[column]) { + mp_raise_ValueError(translate("Row or Column pin duplicated")); + } + } + } + + for (size_t column = 0; column < num_column_pins; column++) { + for (size_t column2 = column + 1; column2 < num_column_pins; column2++) { + if (column_pins_array[column] == column_pins_array[column2]) { + mp_raise_ValueError(translate("Row or Column pin duplicated")); + } + } + } + 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); return MP_OBJ_FROM_PTR(self); } From 168ed355b103cbeffbf632a861bde7b945eb5222 Mon Sep 17 00:00:00 2001 From: gamblor21 Date: Tue, 17 Aug 2021 17:55:26 -0500 Subject: [PATCH 2/5] Made check function generic --- locale/circuitpython.pot | 12 ++++++--- shared-bindings/keypad/KeyMatrix.c | 26 +++----------------- shared-bindings/keypad/Keys.c | 1 + shared-bindings/microcontroller/Pin.c | 35 +++++++++++++++++++++++++++ shared-bindings/microcontroller/Pin.h | 2 ++ 5 files changed, 50 insertions(+), 26 deletions(-) diff --git a/locale/circuitpython.pot b/locale/circuitpython.pot index 8fee3982a6..7e2794ee09 100644 --- a/locale/circuitpython.pot +++ b/locale/circuitpython.pot @@ -66,6 +66,14 @@ msgid "" "%d address pins, %d rgb pins and %d tiles indicate a height of %d, not %d" msgstr "" +#: shared-bindings/microcontroller/Pin.c +msgid "%q and %q contain duplicate objects" +msgstr "" + +#: shared-bindings/microcontroller/Pin.c +msgid "%q contains duplicate pins" +msgstr "" + #: ports/atmel-samd/common-hal/sdioio/SDCard.c msgid "%q failure: %d" msgstr "" @@ -1998,10 +2006,6 @@ msgstr "" msgid "Row entry must be digitalio.DigitalInOut" msgstr "" -#: shared-bindings/keypad/KeyMatrix.c -msgid "Row or Column pin duplicated" -msgstr "" - #: main.c msgid "Running in safe mode! Not running saved code.\n" msgstr "" diff --git a/shared-bindings/keypad/KeyMatrix.c b/shared-bindings/keypad/KeyMatrix.c index eb87d2bd22..8b87432074 100644 --- a/shared-bindings/keypad/KeyMatrix.c +++ b/shared-bindings/keypad/KeyMatrix.c @@ -90,6 +90,10 @@ STATIC mp_obj_t keypad_keymatrix_make_new(const mp_obj_type_t *type, size_t n_ar mcu_pin_obj_t *row_pins_array[num_row_pins]; mcu_pin_obj_t *column_pins_array[num_column_pins]; + validate_no_duplicate_pins(row_pins, MP_QSTR_row_pins); + validate_no_duplicate_pins(column_pins, MP_QSTR_column_pins); + validate_no_duplicate_pins_2(row_pins, column_pins, MP_QSTR_row_pins, MP_QSTR_column_pins); + for (size_t row = 0; row < num_row_pins; row++) { mcu_pin_obj_t *pin = 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 column_pins_array[column] = pin; } - for (size_t row = 0; row < num_row_pins; row++) { - for (size_t row2 = row + 1; row2 < num_row_pins; row2++) { - if (row_pins_array[row] == row_pins_array[row2]) { - mp_raise_ValueError(translate("Row or Column pin duplicated")); - } - } - - for (size_t column = 0; column < num_column_pins; column++) { - if (row_pins_array[row] == column_pins_array[column]) { - mp_raise_ValueError(translate("Row or Column pin duplicated")); - } - } - } - - for (size_t column = 0; column < num_column_pins; column++) { - for (size_t column2 = column + 1; column2 < num_column_pins; column2++) { - if (column_pins_array[column] == column_pins_array[column2]) { - mp_raise_ValueError(translate("Row or Column pin duplicated")); - } - } - } - 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); return MP_OBJ_FROM_PTR(self); } diff --git a/shared-bindings/keypad/Keys.c b/shared-bindings/keypad/Keys.c index d616bcff84..dc533a2e2b 100644 --- a/shared-bindings/keypad/Keys.c +++ b/shared-bindings/keypad/Keys.c @@ -78,6 +78,7 @@ STATIC mp_obj_t keypad_keys_make_new(const mp_obj_type_t *type, size_t n_args, c mp_arg_parse_all(n_args, pos_args, kw_args, MP_ARRAY_SIZE(allowed_args), allowed_args, args); mp_obj_t pins = args[ARG_pins].u_obj; + validate_no_duplicate_pins(pins, MP_QSTR_row_pins); // mp_obj_len() will be >= 0. const size_t num_pins = (size_t)MP_OBJ_SMALL_INT_VALUE(mp_obj_len(pins)); diff --git a/shared-bindings/microcontroller/Pin.c b/shared-bindings/microcontroller/Pin.c index acb1710f3d..9984669714 100644 --- a/shared-bindings/microcontroller/Pin.c +++ b/shared-bindings/microcontroller/Pin.c @@ -105,6 +105,41 @@ mcu_pin_obj_t *validate_obj_is_free_pin(mp_obj_t obj) { return pin; } +// Validate every element in the list is a unique pin +void validate_no_duplicate_pins(mp_obj_t seq, qstr arg_name) { + mp_int_t num_pins = MP_OBJ_SMALL_INT_VALUE(mp_obj_len(seq)); + + for (size_t pin_cnt = 0; pin_cnt < num_pins; pin_cnt++) { + mp_obj_t pin1_obj = mp_obj_subscr(seq, MP_OBJ_NEW_SMALL_INT(pin_cnt), MP_OBJ_SENTINEL); + mcu_pin_obj_t *pin1 = validate_obj_is_pin(pin1_obj); + + for (size_t pin_cnt_2 = pin_cnt + 1; pin_cnt_2 < num_pins; pin_cnt_2++) { + mp_obj_t pin2_obj = mp_obj_subscr(seq, MP_OBJ_NEW_SMALL_INT(pin_cnt_2), MP_OBJ_SENTINEL); + mcu_pin_obj_t *pin2 = validate_obj_is_pin(pin2_obj); + if (pin1 == pin2) { + mp_raise_TypeError_varg(translate("%q contains duplicate pins"), arg_name); + } + } + } +} + +void validate_no_duplicate_pins_2(mp_obj_t seq1, mp_obj_t seq2, qstr arg_name1, qstr arg_name2) { + const size_t num_pins_1 = MP_OBJ_SMALL_INT_VALUE(mp_obj_len(seq1)); + const size_t num_pins_2 = MP_OBJ_SMALL_INT_VALUE(mp_obj_len(seq2)); + + for (size_t pin_cnt_1 = 0; pin_cnt_1 < num_pins_1; pin_cnt_1++) { + mp_obj_t pin1_obj = mp_obj_subscr(seq1, MP_OBJ_NEW_SMALL_INT(pin_cnt_1), MP_OBJ_SENTINEL); + mcu_pin_obj_t *pin1 = validate_obj_is_pin(pin1_obj); + + for (size_t pin_cnt_2 = 0; pin_cnt_2 < num_pins_2; pin_cnt_2++) { + mp_obj_t pin2_obj = mp_obj_subscr(seq2, MP_OBJ_NEW_SMALL_INT(pin_cnt_2), MP_OBJ_SENTINEL); + if (pin1_obj == pin2_obj) { + mp_raise_TypeError_varg(translate("%q and %q contain duplicate objects"), arg_name1, arg_name2); + } + } + } +} + // Validate every element in the list to be a free pin. 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) { mp_int_t len = MP_OBJ_SMALL_INT_VALUE(mp_obj_len(seq)); diff --git a/shared-bindings/microcontroller/Pin.h b/shared-bindings/microcontroller/Pin.h index 44019ff267..a8ac6eeb1c 100644 --- a/shared-bindings/microcontroller/Pin.h +++ b/shared-bindings/microcontroller/Pin.h @@ -37,6 +37,8 @@ mcu_pin_obj_t *validate_obj_is_pin(mp_obj_t obj); mcu_pin_obj_t *validate_obj_is_pin_or_none(mp_obj_t obj); mcu_pin_obj_t *validate_obj_is_free_pin(mp_obj_t obj); mcu_pin_obj_t *validate_obj_is_free_pin_or_none(mp_obj_t obj); +void validate_no_duplicate_pins(mp_obj_t seq, qstr arg_name); +void validate_no_duplicate_pins_2(mp_obj_t seq1, mp_obj_t seq2, qstr arg_name1, qstr arg_name2); 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); void validate_pins(qstr what, uint8_t *pin_nos, mp_int_t max_pins, mp_obj_t seq, uint8_t *count_out); From e5dc7221765467b49970b2144f8485d91cad6c48 Mon Sep 17 00:00:00 2001 From: gamblor21 Date: Tue, 17 Aug 2021 19:16:26 -0500 Subject: [PATCH 3/5] Fix for int type and pin validation --- shared-bindings/microcontroller/Pin.c | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/shared-bindings/microcontroller/Pin.c b/shared-bindings/microcontroller/Pin.c index 9984669714..d709c669af 100644 --- a/shared-bindings/microcontroller/Pin.c +++ b/shared-bindings/microcontroller/Pin.c @@ -107,7 +107,7 @@ mcu_pin_obj_t *validate_obj_is_free_pin(mp_obj_t obj) { // Validate every element in the list is a unique pin void validate_no_duplicate_pins(mp_obj_t seq, qstr arg_name) { - mp_int_t num_pins = MP_OBJ_SMALL_INT_VALUE(mp_obj_len(seq)); + const size_t num_pins = (size_t)MP_OBJ_SMALL_INT_VALUE(mp_obj_len(seq)); for (size_t pin_cnt = 0; pin_cnt < num_pins; pin_cnt++) { mp_obj_t pin1_obj = mp_obj_subscr(seq, MP_OBJ_NEW_SMALL_INT(pin_cnt), MP_OBJ_SENTINEL); @@ -124,8 +124,8 @@ void validate_no_duplicate_pins(mp_obj_t seq, qstr arg_name) { } void validate_no_duplicate_pins_2(mp_obj_t seq1, mp_obj_t seq2, qstr arg_name1, qstr arg_name2) { - const size_t num_pins_1 = MP_OBJ_SMALL_INT_VALUE(mp_obj_len(seq1)); - const size_t num_pins_2 = MP_OBJ_SMALL_INT_VALUE(mp_obj_len(seq2)); + const size_t num_pins_1 = (size_t)MP_OBJ_SMALL_INT_VALUE(mp_obj_len(seq1)); + const size_t num_pins_2 = (size_t)MP_OBJ_SMALL_INT_VALUE(mp_obj_len(seq2)); for (size_t pin_cnt_1 = 0; pin_cnt_1 < num_pins_1; pin_cnt_1++) { mp_obj_t pin1_obj = mp_obj_subscr(seq1, MP_OBJ_NEW_SMALL_INT(pin_cnt_1), MP_OBJ_SENTINEL); @@ -133,7 +133,8 @@ void validate_no_duplicate_pins_2(mp_obj_t seq1, mp_obj_t seq2, qstr arg_name1, for (size_t pin_cnt_2 = 0; pin_cnt_2 < num_pins_2; pin_cnt_2++) { mp_obj_t pin2_obj = mp_obj_subscr(seq2, MP_OBJ_NEW_SMALL_INT(pin_cnt_2), MP_OBJ_SENTINEL); - if (pin1_obj == pin2_obj) { + mcu_pin_obj_t *pin2 = validate_obj_is_pin(pin2_obj); + if (pin1 == pin2) { mp_raise_TypeError_varg(translate("%q and %q contain duplicate objects"), arg_name1, arg_name2); } } From d02a4b9f71a757686d7273673afcb61632f9ee73 Mon Sep 17 00:00:00 2001 From: gamblor21 Date: Wed, 18 Aug 2021 10:16:44 -0500 Subject: [PATCH 4/5] Removed ulab to make space in blackpill with flash board --- .../boards/stm32f411ce_blackpill_with_flash/mpconfigboard.mk | 3 +++ 1 file changed, 3 insertions(+) diff --git a/ports/stm/boards/stm32f411ce_blackpill_with_flash/mpconfigboard.mk b/ports/stm/boards/stm32f411ce_blackpill_with_flash/mpconfigboard.mk index e095d69403..9da7163743 100644 --- a/ports/stm/boards/stm32f411ce_blackpill_with_flash/mpconfigboard.mk +++ b/ports/stm/boards/stm32f411ce_blackpill_with_flash/mpconfigboard.mk @@ -16,3 +16,6 @@ MCU_PACKAGE = UFQFPN48 LD_COMMON = boards/common_default.ld LD_FILE = boards/STM32F411_nofs.ld + +# Too big for the flash +CIRCUITPY_ULAB = 0 From 47db00f0af698e09ec6b0ba5db872c6fb14f1785 Mon Sep 17 00:00:00 2001 From: gamblor21 Date: Thu, 19 Aug 2021 20:03:49 -0500 Subject: [PATCH 5/5] Made error message clear and reduce calls --- locale/circuitpython.pot | 2 +- shared-bindings/keypad/KeyMatrix.c | 2 -- shared-bindings/microcontroller/Pin.c | 5 ++++- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/locale/circuitpython.pot b/locale/circuitpython.pot index 7e2794ee09..ef03da9ebe 100644 --- a/locale/circuitpython.pot +++ b/locale/circuitpython.pot @@ -67,7 +67,7 @@ msgid "" msgstr "" #: shared-bindings/microcontroller/Pin.c -msgid "%q and %q contain duplicate objects" +msgid "%q and %q contain duplicate pins" msgstr "" #: shared-bindings/microcontroller/Pin.c diff --git a/shared-bindings/keypad/KeyMatrix.c b/shared-bindings/keypad/KeyMatrix.c index 8b87432074..dbb4ac6822 100644 --- a/shared-bindings/keypad/KeyMatrix.c +++ b/shared-bindings/keypad/KeyMatrix.c @@ -90,8 +90,6 @@ STATIC mp_obj_t keypad_keymatrix_make_new(const mp_obj_type_t *type, size_t n_ar mcu_pin_obj_t *row_pins_array[num_row_pins]; mcu_pin_obj_t *column_pins_array[num_column_pins]; - validate_no_duplicate_pins(row_pins, MP_QSTR_row_pins); - validate_no_duplicate_pins(column_pins, MP_QSTR_column_pins); validate_no_duplicate_pins_2(row_pins, column_pins, MP_QSTR_row_pins, MP_QSTR_column_pins); for (size_t row = 0; row < num_row_pins; row++) { diff --git a/shared-bindings/microcontroller/Pin.c b/shared-bindings/microcontroller/Pin.c index d709c669af..78c1c90f4d 100644 --- a/shared-bindings/microcontroller/Pin.c +++ b/shared-bindings/microcontroller/Pin.c @@ -127,6 +127,9 @@ void validate_no_duplicate_pins_2(mp_obj_t seq1, mp_obj_t seq2, qstr arg_name1, const size_t num_pins_1 = (size_t)MP_OBJ_SMALL_INT_VALUE(mp_obj_len(seq1)); const size_t num_pins_2 = (size_t)MP_OBJ_SMALL_INT_VALUE(mp_obj_len(seq2)); + validate_no_duplicate_pins(seq1, arg_name1); + validate_no_duplicate_pins(seq2, arg_name2); + for (size_t pin_cnt_1 = 0; pin_cnt_1 < num_pins_1; pin_cnt_1++) { mp_obj_t pin1_obj = mp_obj_subscr(seq1, MP_OBJ_NEW_SMALL_INT(pin_cnt_1), MP_OBJ_SENTINEL); mcu_pin_obj_t *pin1 = validate_obj_is_pin(pin1_obj); @@ -135,7 +138,7 @@ void validate_no_duplicate_pins_2(mp_obj_t seq1, mp_obj_t seq2, qstr arg_name1, mp_obj_t pin2_obj = mp_obj_subscr(seq2, MP_OBJ_NEW_SMALL_INT(pin_cnt_2), MP_OBJ_SENTINEL); mcu_pin_obj_t *pin2 = validate_obj_is_pin(pin2_obj); if (pin1 == pin2) { - mp_raise_TypeError_varg(translate("%q and %q contain duplicate objects"), arg_name1, arg_name2); + mp_raise_TypeError_varg(translate("%q and %q contain duplicate pins"), arg_name1, arg_name2); } } }