diff --git a/micropython/modules/motor/motor.cpp b/micropython/modules/motor/motor.cpp index 750c5852..85de066a 100644 --- a/micropython/modules/motor/motor.cpp +++ b/micropython/modules/motor/motor.cpp @@ -635,12 +635,12 @@ mp_obj_t MotorCluster_make_new(const mp_obj_type_t *type, size_t n_args, size_t mp_raise_TypeError("list or tuple must contain at least one pair tuple"); else { // Specific check for is a single 2 pin list/tuple was provided - if(pair_count == 2 && mp_obj_is_int(items[0]) && mp_obj_is_int(items[1])) { + if(pair_count == 2 && pimoroni_obj_is_int_or_gpio(items[0]) && pimoroni_obj_is_int_or_gpio(items[1])) { pins = m_new(pin_pair, 1); pair_count = 1; - int pos = mp_obj_get_int(items[0]); - int neg = mp_obj_get_int(items[1]); + int pos = pimoroni_gpio_from_obj(items[0]); + int neg = pimoroni_gpio_from_obj(items[1]); if((pos < 0 || pos >= (int)NUM_BANK0_GPIOS) || (neg < 0 || neg >= (int)NUM_BANK0_GPIOS)) { delete[] pins; @@ -669,8 +669,8 @@ mp_obj_t MotorCluster_make_new(const mp_obj_type_t *type, size_t n_args, size_t delete[] pins; mp_raise_ValueError("pair tuple must only contain two integers"); } - int pos = mp_obj_get_int(tuple->items[0]); - int neg = mp_obj_get_int(tuple->items[1]); + int pos = pimoroni_gpio_from_obj(tuple->items[0]); + int neg = pimoroni_gpio_from_obj(tuple->items[1]); if((pos < 0 || pos >= (int)NUM_BANK0_GPIOS) || (neg < 0 || neg >= (int)NUM_BANK0_GPIOS)) { delete[] pins; diff --git a/micropython/modules/pin.cpp b/micropython/modules/pin.cpp index 7b811e73..8154dee9 100644 --- a/micropython/modules/pin.cpp +++ b/micropython/modules/pin.cpp @@ -24,4 +24,21 @@ extern int pimoroni_gpio_from_obj(const mp_obj_t &object) { } return gpio; } + +extern int pimoroni_obj_is_int_or_gpio(const mp_obj_t &object) { + int is_int_or_gpio = false; + if (mp_obj_is_type(object, &machine_pin_type)) { + #if MICROPY_HW_PIN_EXT_COUNT + machine_pin_obj_t *pin = MP_OBJ_TO_PTR2(object, machine_pin_obj_t); + is_int_or_gpio = !pin->is_ext; + #else + is_int_or_gpio = true; + #endif + } + else { + is_int_or_gpio = mp_obj_is_int(object); + } + + return is_int_or_gpio; +} } \ No newline at end of file diff --git a/micropython/modules/pin.hpp b/micropython/modules/pin.hpp index 5a1bf124..e6ad0324 100644 --- a/micropython/modules/pin.hpp +++ b/micropython/modules/pin.hpp @@ -2,4 +2,5 @@ extern "C" { #include "py/obj.h" extern int pimoroni_gpio_from_obj(const mp_obj_t &object); +extern int pimoroni_obj_is_int_or_gpio(const mp_obj_t &object); } \ No newline at end of file diff --git a/micropython/modules/servo/servo.cpp b/micropython/modules/servo/servo.cpp index 56fac844..2aae5aeb 100644 --- a/micropython/modules/servo/servo.cpp +++ b/micropython/modules/servo/servo.cpp @@ -1288,7 +1288,7 @@ mp_obj_t ServoCluster_make_new(const mp_obj_type_t *type, size_t n_args, size_t // Create and populate a local array of pins pins = m_new(uint8_t, pin_count); for(size_t i = 0; i < pin_count; i++) { - int pin = mp_obj_get_int(items[i]); + int pin = pimoroni_gpio_from_obj(items[i]); if(pin < 0 || pin >= (int)NUM_BANK0_GPIOS) { m_free(pins); mp_raise_ValueError("a pin in the list or tuple is out of range. Expected 0 to 29");