Added support for pin objects on Servo and Motor cluster

feature/yukon
ZodiusInfuser 2023-10-13 14:59:13 +01:00
rodzic 930487af3a
commit 70dea93042
4 zmienionych plików z 24 dodań i 6 usunięć

Wyświetl plik

@ -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;

Wyświetl plik

@ -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;
}
}

Wyświetl plik

@ -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);
}

Wyświetl plik

@ -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");