summaryrefslogtreecommitdiff
path: root/shared-bindings
diff options
context:
space:
mode:
authorDan Halbert <halbert@halwitz.org>2020-02-28 23:32:24 -0500
committerDan Halbert <halbert@halwitz.org>2020-02-28 23:43:04 -0500
commitb6206406de2a232299ebdd1d187c7656ae79f8f2 (patch)
treea5738ccf40ddd8092a1f2edf9811e4a3b6404968 /shared-bindings
parent29e44721d2d4712de865aa3a3b8fdd5de90c029b (diff)
new pin validation routines; don't use mp_const_none if NULL will do
Diffstat (limited to 'shared-bindings')
-rw-r--r--shared-bindings/analogio/AnalogIn.c9
-rw-r--r--shared-bindings/analogio/AnalogOut.c6
-rw-r--r--shared-bindings/audiobusio/I2SOut.c14
-rw-r--r--shared-bindings/audiobusio/PDMIn.c11
-rw-r--r--shared-bindings/audioio/AudioOut.c12
-rw-r--r--shared-bindings/audiopwmio/PWMAudioOut.c12
-rw-r--r--shared-bindings/bitbangio/I2C.c7
-rw-r--r--shared-bindings/bitbangio/OneWire.c5
-rw-r--r--shared-bindings/bitbangio/SPI.c10
-rw-r--r--shared-bindings/busio/I2C.c10
-rw-r--r--shared-bindings/busio/OneWire.c4
-rw-r--r--shared-bindings/busio/SPI.c16
-rw-r--r--shared-bindings/busio/UART.c20
-rw-r--r--shared-bindings/digitalio/DigitalInOut.c6
-rw-r--r--shared-bindings/displayio/Display.c8
-rw-r--r--shared-bindings/displayio/EPaperDisplay.c8
-rw-r--r--shared-bindings/frequencyio/FrequencyIn.c4
-rw-r--r--shared-bindings/i2cslave/I2CSlave.c8
-rw-r--r--shared-bindings/microcontroller/Pin.c29
-rw-r--r--shared-bindings/microcontroller/Pin.h6
-rw-r--r--shared-bindings/ps2io/Ps2.c9
-rw-r--r--shared-bindings/pulseio/PWMOut.c5
-rw-r--r--shared-bindings/pulseio/PulseIn.c4
-rw-r--r--shared-bindings/rotaryio/IncrementalEncoder.c9
-rw-r--r--shared-bindings/touchio/TouchIn.c5
-rw-r--r--shared-bindings/wiznet/wiznet5k.c6
26 files changed, 93 insertions, 150 deletions
diff --git a/shared-bindings/analogio/AnalogIn.c b/shared-bindings/analogio/AnalogIn.c
index 9a9b525d8..9d1312dd8 100644
--- a/shared-bindings/analogio/AnalogIn.c
+++ b/shared-bindings/analogio/AnalogIn.c
@@ -63,16 +63,13 @@ STATIC mp_obj_t analogio_analogin_make_new(const mp_obj_type_t *type,
mp_arg_check_num(n_args, kw_args, 1, 1, false);
// 1st argument is the pin
- mp_obj_t pin_obj = args[0];
- assert_pin(pin_obj, false);
+ const mcu_pin_obj_t *pin = validate_is_free_pin(args[0]);
analogio_analogin_obj_t *self = m_new_obj(analogio_analogin_obj_t);
self->base.type = &analogio_analogin_type;
- const mcu_pin_obj_t *pin = MP_OBJ_TO_PTR(pin_obj);
- assert_pin_free(pin);
common_hal_analogio_analogin_construct(self, pin);
- return (mp_obj_t) self;
+ return MP_OBJ_FROM_PTR(self);
}
//| .. method:: deinit()
@@ -141,7 +138,7 @@ STATIC mp_obj_t analogio_analogin_obj_get_reference_voltage(mp_obj_t self_in) {
float reference_voltage = common_hal_analogio_analogin_get_reference_voltage(self);
if (reference_voltage <= 0.0f) {
- return mp_const_none;
+ return mp_const_none;
} else {
return mp_obj_new_float(reference_voltage);
}
diff --git a/shared-bindings/analogio/AnalogOut.c b/shared-bindings/analogio/AnalogOut.c
index 0816da465..2496f1784 100644
--- a/shared-bindings/analogio/AnalogOut.c
+++ b/shared-bindings/analogio/AnalogOut.c
@@ -62,15 +62,13 @@ STATIC mp_obj_t analogio_analogout_make_new(const mp_obj_type_t *type, mp_uint_t
// check arguments
mp_arg_check_num(n_args, kw_args, 1, 1, false);
- assert_pin(args[0], false);
- const mcu_pin_obj_t *pin = MP_OBJ_TO_PTR(args[0]);
+ const mcu_pin_obj_t *pin = validate_is_free_pin(args[0]);
analogio_analogout_obj_t *self = m_new_obj(analogio_analogout_obj_t);
self->base.type = &analogio_analogout_type;
- assert_pin_free(pin);
common_hal_analogio_analogout_construct(self, pin);
- return self;
+ return MP_OBJ_FROM_PTR(self);
}
//| .. method:: deinit()
diff --git a/shared-bindings/audiobusio/I2SOut.c b/shared-bindings/audiobusio/I2SOut.c
index 8f7382fde..45f703795 100644
--- a/shared-bindings/audiobusio/I2SOut.c
+++ b/shared-bindings/audiobusio/I2SOut.c
@@ -105,17 +105,9 @@ STATIC mp_obj_t audiobusio_i2sout_make_new(const mp_obj_type_t *type, size_t n_a
mp_arg_val_t args[MP_ARRAY_SIZE(allowed_args)];
mp_arg_parse_all(n_args, pos_args, kw_args, MP_ARRAY_SIZE(allowed_args), allowed_args, args);
- mp_obj_t bit_clock_obj = args[ARG_bit_clock].u_obj;
- assert_pin(bit_clock_obj, false);
- const mcu_pin_obj_t *bit_clock = MP_OBJ_TO_PTR(bit_clock_obj);
-
- mp_obj_t word_select_obj = args[ARG_word_select].u_obj;
- assert_pin(word_select_obj, false);
- const mcu_pin_obj_t *word_select = MP_OBJ_TO_PTR(word_select_obj);
-
- mp_obj_t data_obj = args[ARG_data].u_obj;
- assert_pin(data_obj, false);
- const mcu_pin_obj_t *data = MP_OBJ_TO_PTR(data_obj);
+ const mcu_pin_obj_t *bit_clock = validate_is_free_pin(args[ARG_bit_clock].u_obj);
+ const mcu_pin_obj_t *word_select = validate_is_free_pin(args[ARG_word_select].u_obj);
+ const mcu_pin_obj_t *data = validate_is_free_pin(args[ARG_data].u_obj);
audiobusio_i2sout_obj_t *self = m_new_obj_with_finaliser(audiobusio_i2sout_obj_t);
self->base.type = &audiobusio_i2sout_type;
diff --git a/shared-bindings/audiobusio/PDMIn.c b/shared-bindings/audiobusio/PDMIn.c
index 0c92c2478..65bc5a9d2 100644
--- a/shared-bindings/audiobusio/PDMIn.c
+++ b/shared-bindings/audiobusio/PDMIn.c
@@ -104,15 +104,8 @@ STATIC mp_obj_t audiobusio_pdmin_make_new(const mp_obj_type_t *type, size_t n_ar
mp_arg_val_t args[MP_ARRAY_SIZE(allowed_args)];
mp_arg_parse_all(n_args, pos_args, kw_args, MP_ARRAY_SIZE(allowed_args), allowed_args, args);
- mp_obj_t clock_pin_obj = args[ARG_clock_pin].u_obj;
- assert_pin(clock_pin_obj, false);
- const mcu_pin_obj_t *clock_pin = MP_OBJ_TO_PTR(clock_pin_obj);
- assert_pin_free(clock_pin);
-
- mp_obj_t data_pin_obj = args[ARG_data_pin].u_obj;
- assert_pin(data_pin_obj, false);
- const mcu_pin_obj_t *data_pin = MP_OBJ_TO_PTR(data_pin_obj);
- assert_pin_free(data_pin);
+ const mcu_pin_obj_t *clock_pin = validate_is_free_pin(args[ARG_clock_pin].u_obj);
+ const mcu_pin_obj_t *data_pin = validate_is_free_pin(args[ARG_data_pin].u_obj);
// create PDMIn object from the given pin
audiobusio_pdmin_obj_t *self = m_new_obj(audiobusio_pdmin_obj_t);
diff --git a/shared-bindings/audioio/AudioOut.c b/shared-bindings/audioio/AudioOut.c
index eb4ef1fc6..687db22d3 100644
--- a/shared-bindings/audioio/AudioOut.c
+++ b/shared-bindings/audioio/AudioOut.c
@@ -104,16 +104,8 @@ STATIC mp_obj_t audioio_audioout_make_new(const mp_obj_type_t *type, size_t n_ar
mp_arg_val_t args[MP_ARRAY_SIZE(allowed_args)];
mp_arg_parse_all(n_args, pos_args, kw_args, MP_ARRAY_SIZE(allowed_args), allowed_args, args);
- mp_obj_t left_channel_obj = args[ARG_left_channel].u_obj;
- assert_pin(left_channel_obj, false);
- const mcu_pin_obj_t *left_channel_pin = MP_OBJ_TO_PTR(left_channel_obj);
-
- mp_obj_t right_channel_obj = args[ARG_right_channel].u_obj;
- const mcu_pin_obj_t *right_channel_pin = NULL;
- if (right_channel_obj != mp_const_none) {
- assert_pin(right_channel_obj, false);
- right_channel_pin = MP_OBJ_TO_PTR(right_channel_obj);
- }
+ const mcu_pin_obj_t *left_channel_pin = validate_is_free_pin(args[ARG_left_channel].u_obj);
+ const mcu_pin_obj_t *right_channel_pin = validate_is_free_pin_or_none(args[ARG_right_channel].u_obj);
// create AudioOut object from the given pin
audioio_audioout_obj_t *self = m_new_obj(audioio_audioout_obj_t);
diff --git a/shared-bindings/audiopwmio/PWMAudioOut.c b/shared-bindings/audiopwmio/PWMAudioOut.c
index 60bf08500..c1c11f9cd 100644
--- a/shared-bindings/audiopwmio/PWMAudioOut.c
+++ b/shared-bindings/audiopwmio/PWMAudioOut.c
@@ -107,16 +107,8 @@ STATIC mp_obj_t audiopwmio_pwmaudioout_make_new(const mp_obj_type_t *type, size_
mp_arg_val_t args[MP_ARRAY_SIZE(allowed_args)];
mp_arg_parse_all(n_args, pos_args, kw_args, MP_ARRAY_SIZE(allowed_args), allowed_args, args);
- mp_obj_t left_channel_obj = args[ARG_left_channel].u_obj;
- assert_pin(left_channel_obj, false);
- const mcu_pin_obj_t *left_channel_pin = MP_OBJ_TO_PTR(left_channel_obj);
-
- mp_obj_t right_channel_obj = args[ARG_right_channel].u_obj;
- const mcu_pin_obj_t *right_channel_pin = NULL;
- if (right_channel_obj != mp_const_none) {
- assert_pin(right_channel_obj, false);
- right_channel_pin = MP_OBJ_TO_PTR(right_channel_obj);
- }
+ const mcu_pin_obj_t *left_channel_pin = validate_is_free_pin(args[ARG_left_channel].u_obj);
+ const mcu_pin_obj_t *right_channel_pin = validate_is_free_pin_or_none(args[ARG_right_channel].u_obj)
// create AudioOut object from the given pin
audiopwmio_pwmaudioout_obj_t *self = m_new_obj(audiopwmio_pwmaudioout_obj_t);
diff --git a/shared-bindings/bitbangio/I2C.c b/shared-bindings/bitbangio/I2C.c
index 01a128393..bdfbfb2ca 100644
--- a/shared-bindings/bitbangio/I2C.c
+++ b/shared-bindings/bitbangio/I2C.c
@@ -63,10 +63,9 @@ STATIC mp_obj_t bitbangio_i2c_make_new(const mp_obj_type_t *type, size_t n_args,
};
mp_arg_val_t args[MP_ARRAY_SIZE(allowed_args)];
mp_arg_parse_all(n_args, pos_args, kw_args, MP_ARRAY_SIZE(allowed_args), allowed_args, args);
- assert_pin(args[ARG_scl].u_obj, false);
- assert_pin(args[ARG_sda].u_obj, false);
- const mcu_pin_obj_t* scl = MP_OBJ_TO_PTR(args[ARG_scl].u_obj);
- const mcu_pin_obj_t* sda = MP_OBJ_TO_PTR(args[ARG_sda].u_obj);
+
+ const mcu_pin_obj_t* scl = validate_is_free_pin(args[ARG_scl].u_obj);
+ const mcu_pin_obj_t* sda = validate_is_free_pin(args[ARG_sda].u_obj);
bitbangio_i2c_obj_t *self = m_new_obj(bitbangio_i2c_obj_t);
self->base.type = &bitbangio_i2c_type;
diff --git a/shared-bindings/bitbangio/OneWire.c b/shared-bindings/bitbangio/OneWire.c
index 73bedcd8d..20ca81c5d 100644
--- a/shared-bindings/bitbangio/OneWire.c
+++ b/shared-bindings/bitbangio/OneWire.c
@@ -69,9 +69,8 @@ STATIC mp_obj_t bitbangio_onewire_make_new(const mp_obj_type_t *type, size_t n_a
};
mp_arg_val_t args[MP_ARRAY_SIZE(allowed_args)];
mp_arg_parse_all(n_args, pos_args, kw_args, MP_ARRAY_SIZE(allowed_args), allowed_args, args);
- assert_pin(args[ARG_pin].u_obj, false);
- const mcu_pin_obj_t* pin = MP_OBJ_TO_PTR(args[ARG_pin].u_obj);
- assert_pin_free(pin);
+
+ const mcu_pin_obj_t* pin = validate_is_free_pin(args[ARG_pin].u_obj);
bitbangio_onewire_obj_t *self = m_new_obj(bitbangio_onewire_obj_t);
self->base.type = &bitbangio_onewire_type;
diff --git a/shared-bindings/bitbangio/SPI.c b/shared-bindings/bitbangio/SPI.c
index 9a51bde66..462352352 100644
--- a/shared-bindings/bitbangio/SPI.c
+++ b/shared-bindings/bitbangio/SPI.c
@@ -71,12 +71,10 @@ STATIC mp_obj_t bitbangio_spi_make_new(const mp_obj_type_t *type, size_t n_args,
};
mp_arg_val_t args[MP_ARRAY_SIZE(allowed_args)];
mp_arg_parse_all(n_args, pos_args, kw_args, MP_ARRAY_SIZE(allowed_args), allowed_args, args);
- assert_pin(args[ARG_clock].u_obj, false);
- assert_pin(args[ARG_MOSI].u_obj, true);
- assert_pin(args[ARG_MISO].u_obj, true);
- const mcu_pin_obj_t* clock = MP_OBJ_TO_PTR(args[ARG_clock].u_obj);
- const mcu_pin_obj_t* mosi = MP_OBJ_TO_PTR(args[ARG_MOSI].u_obj);
- const mcu_pin_obj_t* miso = MP_OBJ_TO_PTR(args[ARG_MISO].u_obj);
+
+ const mcu_pin_obj_t* clock = validate_is_free_pin(args[ARG_clock].u_obj);
+ const mcu_pin_obj_t* mosi = validate_is_free_pin_or_none(args[ARG_MOSI].u_obj);
+ const mcu_pin_obj_t* miso = validate_is_free_pin_or_none(args[ARG_MISO].u_obj);
bitbangio_spi_obj_t *self = m_new_obj(bitbangio_spi_obj_t);
self->base.type = &bitbangio_spi_type;
diff --git a/shared-bindings/busio/I2C.c b/shared-bindings/busio/I2C.c
index 50a95beb2..618a5ad32 100644
--- a/shared-bindings/busio/I2C.c
+++ b/shared-bindings/busio/I2C.c
@@ -76,12 +76,10 @@ STATIC mp_obj_t busio_i2c_make_new(const mp_obj_type_t *type, size_t n_args, con
};
mp_arg_val_t args[MP_ARRAY_SIZE(allowed_args)];
mp_arg_parse_all(n_args, pos_args, kw_args, MP_ARRAY_SIZE(allowed_args), allowed_args, args);
- assert_pin(args[ARG_scl].u_obj, false);
- assert_pin(args[ARG_sda].u_obj, false);
- const mcu_pin_obj_t* scl = MP_OBJ_TO_PTR(args[ARG_scl].u_obj);
- assert_pin_free(scl);
- const mcu_pin_obj_t* sda = MP_OBJ_TO_PTR(args[ARG_sda].u_obj);
- assert_pin_free(sda);
+
+ const mcu_pin_obj_t* scl = validate_is_free_pin(args[ARG_scl].u_obj);
+ const mcu_pin_obj_t* sda = validate_is_free_pin(args[ARG_sda].u_obj);
+
common_hal_busio_i2c_construct(self, scl, sda, args[ARG_frequency].u_int, args[ARG_timeout].u_int);
return (mp_obj_t)self;
}
diff --git a/shared-bindings/busio/OneWire.c b/shared-bindings/busio/OneWire.c
index aca2a3ef2..b28495096 100644
--- a/shared-bindings/busio/OneWire.c
+++ b/shared-bindings/busio/OneWire.c
@@ -69,9 +69,7 @@ STATIC mp_obj_t busio_onewire_make_new(const mp_obj_type_t *type, size_t n_args,
};
mp_arg_val_t args[MP_ARRAY_SIZE(allowed_args)];
mp_arg_parse_all(n_args, pos_args, kw_args, MP_ARRAY_SIZE(allowed_args), allowed_args, args);
- assert_pin(args[ARG_pin].u_obj, false);
- const mcu_pin_obj_t* pin = MP_OBJ_TO_PTR(args[ARG_pin].u_obj);
- assert_pin_free(pin);
+ const mcu_pin_obj_t* pin = validate_is_free_pin(args[ARG_pin].u_obj);
busio_onewire_obj_t *self = m_new_obj(busio_onewire_obj_t);
self->base.type = &busio_onewire_type;
diff --git a/shared-bindings/busio/SPI.c b/shared-bindings/busio/SPI.c
index 828ffb8d0..ca84c0f24 100644
--- a/shared-bindings/busio/SPI.c
+++ b/shared-bindings/busio/SPI.c
@@ -89,17 +89,13 @@ STATIC mp_obj_t busio_spi_make_new(const mp_obj_type_t *type, size_t n_args, con
};
mp_arg_val_t args[MP_ARRAY_SIZE(allowed_args)];
mp_arg_parse_all(n_args, pos_args, kw_args, MP_ARRAY_SIZE(allowed_args), allowed_args, args);
- assert_pin(args[ARG_clock].u_obj, false);
- assert_pin(args[ARG_MOSI].u_obj, true);
- assert_pin(args[ARG_MISO].u_obj, true);
- const mcu_pin_obj_t* clock = MP_OBJ_TO_PTR(args[ARG_clock].u_obj);
- assert_pin_free(clock);
- const mcu_pin_obj_t* mosi = MP_OBJ_TO_PTR(args[ARG_MOSI].u_obj);
- assert_pin_free(mosi);
- const mcu_pin_obj_t* miso = MP_OBJ_TO_PTR(args[ARG_MISO].u_obj);
- assert_pin_free(miso);
+
+ const mcu_pin_obj_t* clock = validate_is_free_pin(args[ARG_clock].u_obj);
+ const mcu_pin_obj_t* mosi = validate_is_free_pin_or_none(args[ARG_MOSI].u_obj);
+ const mcu_pin_obj_t* miso = validate_is_free_pin_or_none(args[ARG_MISO].u_obj);
+
common_hal_busio_spi_construct(self, clock, mosi, miso);
- return (mp_obj_t)self;
+ return MP_OBJ_FROM_PTR(self);
}
//| .. method:: deinit()
diff --git a/shared-bindings/busio/UART.c b/shared-bindings/busio/UART.c
index 02c5afb16..ffa50fd7d 100644
--- a/shared-bindings/busio/UART.c
+++ b/shared-bindings/busio/UART.c
@@ -105,13 +105,12 @@ STATIC mp_obj_t busio_uart_make_new(const mp_obj_type_t *type, size_t n_args, co
mp_arg_val_t args[MP_ARRAY_SIZE(allowed_args)];
mp_arg_parse_all(n_args, pos_args, kw_args, MP_ARRAY_SIZE(allowed_args), allowed_args, args);
- assert_pin(args[ARG_rx].u_obj, true);
- const mcu_pin_obj_t* rx = MP_OBJ_TO_PTR(args[ARG_rx].u_obj);
- assert_pin_free(rx);
+ const mcu_pin_obj_t* rx = validate_is_free_pin_or_none(args[ARG_rx].u_obj);
+ const mcu_pin_obj_t* tx = validate_is_free_pin_or_none(args[ARG_tx].u_obj);
- assert_pin(args[ARG_tx].u_obj, true);
- const mcu_pin_obj_t* tx = MP_OBJ_TO_PTR(args[ARG_tx].u_obj);
- assert_pin_free(tx);
+ if ( (tx == NULL) && (rx == NULL) ) {
+ mp_raise_ValueError(translate("tx and rx cannot both be None"));
+ }
uint8_t bits = args[ARG_bits].u_int;
if (bits < 7 || bits > 9) {
@@ -133,12 +132,11 @@ STATIC mp_obj_t busio_uart_make_new(const mp_obj_type_t *type, size_t n_args, co
mp_float_t timeout = mp_obj_get_float(args[ARG_timeout].u_obj);
validate_timeout(timeout);
- const mcu_pin_obj_t* rts = MP_OBJ_TO_PTR(args[ARG_rts].u_obj);
-
- const mcu_pin_obj_t* cts = MP_OBJ_TO_PTR(args[ARG_cts].u_obj);
+ const mcu_pin_obj_t* rts = validate_is_free_pin_or_none(args[ARG_rts].u_obj);
+ const mcu_pin_obj_t* cts = validate_is_free_pin_or_none(args[ARG_cts].u_obj);
+ const mcu_pin_obj_t* rs485_dir = validate_is_free_pin_or_none(args[ARG_rs485_dir].u_obj);
- const mcu_pin_obj_t* rs485_dir = args[ARG_rs485_dir].u_obj;
- bool rs485_invert = args[ARG_rs485_invert].u_bool;
+ const bool rs485_invert = args[ARG_rs485_invert].u_bool;
common_hal_busio_uart_construct(self, tx, rx, rts, cts, rs485_dir, rs485_invert,
args[ARG_baudrate].u_int, bits, parity, stop, timeout,
diff --git a/shared-bindings/digitalio/DigitalInOut.c b/shared-bindings/digitalio/DigitalInOut.c
index 16472c12c..1610c83f8 100644
--- a/shared-bindings/digitalio/DigitalInOut.c
+++ b/shared-bindings/digitalio/DigitalInOut.c
@@ -68,12 +68,10 @@ STATIC mp_obj_t digitalio_digitalinout_make_new(const mp_obj_type_t *type,
digitalio_digitalinout_obj_t *self = m_new_obj(digitalio_digitalinout_obj_t);
self->base.type = &digitalio_digitalinout_type;
- assert_pin(args[0], false);
- mcu_pin_obj_t *pin = MP_OBJ_TO_PTR(args[0]);
- assert_pin_free(pin);
+ mcu_pin_obj_t *pin = validate_is_free_pin(args[0]);
common_hal_digitalio_digitalinout_construct(self, pin);
- return (mp_obj_t)self;
+ return MP_OBJ_FROM_PTR(self);
}
//| .. method:: deinit()
diff --git a/shared-bindings/displayio/Display.c b/shared-bindings/displayio/Display.c
index 5759e8ad2..9fa976b86 100644
--- a/shared-bindings/displayio/Display.c
+++ b/shared-bindings/displayio/Display.c
@@ -141,13 +141,7 @@ STATIC mp_obj_t displayio_display_make_new(const mp_obj_type_t *type, size_t n_a
mp_buffer_info_t bufinfo;
mp_get_buffer_raise(args[ARG_init_sequence].u_obj, &bufinfo, MP_BUFFER_READ);
- mp_obj_t backlight_pin_obj = args[ARG_backlight_pin].u_obj;
- assert_pin(backlight_pin_obj, true);
- const mcu_pin_obj_t* backlight_pin = NULL;
- if (backlight_pin_obj != NULL && backlight_pin_obj != mp_const_none) {
- backlight_pin = MP_OBJ_TO_PTR(backlight_pin_obj);
- assert_pin_free(backlight_pin);
- }
+ const mcu_pin_obj_t* backlight_pin = validate_is_free_pin_or_none(args[ARG_backlight_pin].u_obj);
mp_float_t brightness = mp_obj_get_float(args[ARG_brightness].u_obj);
diff --git a/shared-bindings/displayio/EPaperDisplay.c b/shared-bindings/displayio/EPaperDisplay.c
index 81e06f82f..60a3838a4 100644
--- a/shared-bindings/displayio/EPaperDisplay.c
+++ b/shared-bindings/displayio/EPaperDisplay.c
@@ -129,13 +129,7 @@ STATIC mp_obj_t displayio_epaperdisplay_make_new(const mp_obj_type_t *type, size
mp_get_buffer_raise(args[ARG_stop_sequence].u_obj, &stop_bufinfo, MP_BUFFER_READ);
- mp_obj_t busy_pin_obj = args[ARG_busy_pin].u_obj;
- assert_pin(busy_pin_obj, true);
- const mcu_pin_obj_t* busy_pin = NULL;
- if (busy_pin_obj != NULL && busy_pin_obj != mp_const_none) {
- busy_pin = MP_OBJ_TO_PTR(busy_pin_obj);
- assert_pin_free(busy_pin);
- }
+ const mcu_pin_obj_t* busy_pin = validate_is_free_pin_or_none(args[ARG_busy_pin].u_obj);
mp_int_t rotation = args[ARG_rotation].u_int;
if (rotation % 90 != 0) {
diff --git a/shared-bindings/frequencyio/FrequencyIn.c b/shared-bindings/frequencyio/FrequencyIn.c
index e2b924c07..349ef7e97 100644
--- a/shared-bindings/frequencyio/FrequencyIn.c
+++ b/shared-bindings/frequencyio/FrequencyIn.c
@@ -87,9 +87,7 @@ STATIC mp_obj_t frequencyio_frequencyin_make_new(const mp_obj_type_t *type, size
mp_arg_val_t args[MP_ARRAY_SIZE(allowed_args)];
mp_arg_parse_all(n_args, pos_args, kw_args, MP_ARRAY_SIZE(allowed_args), allowed_args, args);
- assert_pin(args[ARG_pin].u_obj, false);
- mcu_pin_obj_t* pin = MP_OBJ_TO_PTR(args[ARG_pin].u_obj);
- assert_pin_free(pin);
+ mcu_pin_obj_t* pin = validate_is_free_pin(args[ARG_pin].u_obj);
const uint16_t capture_period = args[ARG_capture_period].u_int;
diff --git a/shared-bindings/i2cslave/I2CSlave.c b/shared-bindings/i2cslave/I2CSlave.c
index c98ea52e0..b7980d517 100644
--- a/shared-bindings/i2cslave/I2CSlave.c
+++ b/shared-bindings/i2cslave/I2CSlave.c
@@ -77,12 +77,8 @@ STATIC mp_obj_t i2cslave_i2c_slave_make_new(const mp_obj_type_t *type, size_t n_
mp_arg_val_t args[MP_ARRAY_SIZE(allowed_args)];
mp_arg_parse_all(n_args, pos_args, kw_args, MP_ARRAY_SIZE(allowed_args), allowed_args, args);
- assert_pin(args[ARG_scl].u_obj, false);
- assert_pin(args[ARG_sda].u_obj, false);
- const mcu_pin_obj_t* scl = MP_OBJ_TO_PTR(args[ARG_scl].u_obj);
- assert_pin_free(scl);
- const mcu_pin_obj_t* sda = MP_OBJ_TO_PTR(args[ARG_sda].u_obj);
- assert_pin_free(sda);
+ const mcu_pin_obj_t* scl = validate_is_free_pin(args[ARG_scl].u_obj);
+ const mcu_pin_obj_t* sda = validate_is_free_pin(args[ARG_sda].u_obj);
mp_obj_iter_buf_t iter_buf;
mp_obj_t iterable = mp_getiter(args[ARG_addresses].u_obj, &iter_buf);
diff --git a/shared-bindings/microcontroller/Pin.c b/shared-bindings/microcontroller/Pin.c
index 3635f0afb..ef8008827 100644
--- a/shared-bindings/microcontroller/Pin.c
+++ b/shared-bindings/microcontroller/Pin.c
@@ -84,10 +84,35 @@ const mp_obj_type_t mcu_pin_type = {
.print = mcu_pin_print
};
-void assert_pin(mp_obj_t obj, bool none_ok) {
- if ((obj != mp_const_none || !none_ok) && !MP_OBJ_IS_TYPE(obj, &mcu_pin_type)) {
+mcu_pin_obj_t *validate_is_pin(mp_obj_t obj) {
+ if (!MP_OBJ_IS_TYPE(obj, &mcu_pin_type)) {
mp_raise_TypeError_varg(translate("Expected a %q"), mcu_pin_type.name);
}
+ return MP_OBJ_TO_PTR(obj);
+}
+
+// Validate that the obj is a pin or None. Return an mcu_pin_obj_t* or NULL, correspondingly.
+mcu_pin_obj_t *validate_is_pin_or_none(mp_obj_t obj) {
+ if (obj == mp_const_none) {
+ return NULL;
+ }
+ return validate_is_pin(obj);
+}
+
+mcu_pin_obj_t *validate_is_free_pin(mp_obj_t obj) {
+ mcu_pin_obj_t *pin = validate_is_pin(obj);
+ assert_pin_free(pin);
+ return pin;
+}
+
+// Validate that the obj is a free pin or None. Return an mcu_pin_obj_t* or NULL, correspondingly.
+mcu_pin_obj_t *validate_is_free_pin_or_none(mp_obj_t obj) {
+ if (obj == mp_const_none) {
+ return NULL;
+ }
+ mcu_pin_obj_t *pin = validate_is_pin(obj);
+ assert_pin_free(pin);
+ return pin;
}
void assert_pin_free(const mcu_pin_obj_t* pin) {
diff --git a/shared-bindings/microcontroller/Pin.h b/shared-bindings/microcontroller/Pin.h
index 2d15dd5c5..2b4083827 100644
--- a/shared-bindings/microcontroller/Pin.h
+++ b/shared-bindings/microcontroller/Pin.h
@@ -33,7 +33,11 @@
// Type object used in Python. Should be shared between ports.
extern const mp_obj_type_t mcu_pin_type;
-void assert_pin(mp_obj_t obj, bool none_ok);
+mcu_pin_obj_t *validate_is_pin(mp_obj_t obj);
+mcu_pin_obj_t *validate_is_pin_or_none(mp_obj_t obj);
+mcu_pin_obj_t *validate_is_free_pin(mp_obj_t obj);
+mcu_pin_obj_t *validate_is_free_pin_or_none(mp_obj_t obj);
+
void assert_pin_free(const mcu_pin_obj_t* pin);
bool common_hal_mcu_pin_is_free(const mcu_pin_obj_t* pin);
diff --git a/shared-bindings/ps2io/Ps2.c b/shared-bindings/ps2io/Ps2.c
index fb5c24b85..f5aa70907 100644
--- a/shared-bindings/ps2io/Ps2.c
+++ b/shared-bindings/ps2io/Ps2.c
@@ -77,12 +77,9 @@ STATIC mp_obj_t ps2io_ps2_make_new(const mp_obj_type_t *type, size_t n_args, con
};
mp_arg_val_t args[MP_ARRAY_SIZE(allowed_args)];
mp_arg_parse_all(n_args, pos_args, kw_args, MP_ARRAY_SIZE(allowed_args), allowed_args, args);
- assert_pin(args[ARG_clkpin].u_obj, false);
- assert_pin(args[ARG_datapin].u_obj, false);
- const mcu_pin_obj_t* clkpin = MP_OBJ_TO_PTR(args[ARG_clkpin].u_obj);
- assert_pin_free(clkpin);
- const mcu_pin_obj_t* datapin = MP_OBJ_TO_PTR(args[ARG_datapin].u_obj);
- assert_pin_free(datapin);
+
+ const mcu_pin_obj_t* clkpin = validate_is_free_pin(args[ARG_clkpin].u_obj);
+ const mcu_pin_obj_t* datapin = validate_is_free_pin(args[ARG_datapin].u_obj);
ps2io_ps2_obj_t *self = m_new_obj(ps2io_ps2_obj_t);
self->base.type = &ps2io_ps2_type;
diff --git a/shared-bindings/pulseio/PWMOut.c b/shared-bindings/pulseio/PWMOut.c
index 53b88c61a..d04b469c1 100644
--- a/shared-bindings/pulseio/PWMOut.c
+++ b/shared-bindings/pulseio/PWMOut.c
@@ -96,10 +96,7 @@ STATIC mp_obj_t pulseio_pwmout_make_new(const mp_obj_type_t *type, size_t n_args
mp_arg_val_t parsed_args[MP_ARRAY_SIZE(allowed_args)];
mp_arg_parse_all(n_args, args, kw_args, MP_ARRAY_SIZE(allowed_args), allowed_args, parsed_args);
- mp_obj_t pin_obj = parsed_args[ARG_pin].u_obj;
- assert_pin(pin_obj, false);
- const mcu_pin_obj_t *pin = MP_OBJ_TO_PTR(pin_obj);
- assert_pin_free(pin);
+ const mcu_pin_obj_t *pin = validate_is_free_pin(parsed_args[ARG_pin].u_obj);
uint16_t duty_cycle = parsed_args[ARG_duty_cycle].u_int;
uint32_t frequency = parsed_args[ARG_frequency].u_int;
diff --git a/shared-bindings/pulseio/PulseIn.c b/shared-bindings/pulseio/PulseIn.c
index 8b69109f0..dbab253af 100644
--- a/shared-bindings/pulseio/PulseIn.c
+++ b/shared-bindings/pulseio/PulseIn.c
@@ -90,9 +90,7 @@ STATIC mp_obj_t pulseio_pulsein_make_new(const mp_obj_type_t *type, size_t n_arg
};
mp_arg_val_t args[MP_ARRAY_SIZE(allowed_args)];
mp_arg_parse_all(n_args, pos_args, kw_args, MP_ARRAY_SIZE(allowed_args), allowed_args, args);
- assert_pin(args[ARG_pin].u_obj, false);
- const mcu_pin_obj_t* pin = MP_OBJ_TO_PTR(args[ARG_pin].u_obj);
- assert_pin_free(pin);
+ const mcu_pin_obj_t* pin = validate_is_free_pin(args[ARG_pin].u_obj);
pulseio_pulsein_obj_t *self = m_new_obj(pulseio_pulsein_obj_t);
self->base.type = &pulseio_pulsein_type;
diff --git a/shared-bindings/rotaryio/IncrementalEncoder.c b/shared-bindings/rotaryio/IncrementalEncoder.c
index f2f157847..78dccacb5 100644
--- a/shared-bindings/rotaryio/IncrementalEncoder.c
+++ b/shared-bindings/rotaryio/IncrementalEncoder.c
@@ -73,13 +73,8 @@ STATIC mp_obj_t rotaryio_incrementalencoder_make_new(const mp_obj_type_t *type,
mp_arg_val_t args[MP_ARRAY_SIZE(allowed_args)];
mp_arg_parse_all(n_args, pos_args, kw_args, MP_ARRAY_SIZE(allowed_args), allowed_args, args);
- assert_pin(args[ARG_pin_a].u_obj, false);
- const mcu_pin_obj_t* pin_a = MP_OBJ_TO_PTR(args[ARG_pin_a].u_obj);
- assert_pin_free(pin_a);
-
- assert_pin(args[ARG_pin_b].u_obj, false);
- const mcu_pin_obj_t* pin_b = MP_OBJ_TO_PTR(args[ARG_pin_b].u_obj);
- assert_pin_free(pin_b);
+ const mcu_pin_obj_t* pin_a = validate_is_free_pin(args[ARG_pin_a].u_obj);
+ const mcu_pin_obj_t* pin_b = validate_is_free_pin(args[ARG_pin_b].u_obj);
rotaryio_incrementalencoder_obj_t *self = m_new_obj(rotaryio_incrementalencoder_obj_t);
self->base.type = &rotaryio_incrementalencoder_type;
diff --git a/shared-bindings/touchio/TouchIn.c b/shared-bindings/touchio/TouchIn.c
index 33d369c74..5eadb2cc4 100644
--- a/shared-bindings/touchio/TouchIn.c
+++ b/shared-bindings/touchio/TouchIn.c
@@ -66,10 +66,7 @@ STATIC mp_obj_t touchio_touchin_make_new(const mp_obj_type_t *type,
mp_arg_check_num(n_args, kw_args, 1, 1, false);
// 1st argument is the pin
- mp_obj_t pin_obj = args[0];
- assert_pin(pin_obj, false);
- const mcu_pin_obj_t *pin = MP_OBJ_TO_PTR(pin_obj);
- assert_pin_free(pin);
+ const mcu_pin_obj_t *pin = validate_is_free_pin(args[0]);
touchio_touchin_obj_t *self = m_new_obj(touchio_touchin_obj_t);
self->base.type = &touchio_touchin_type;
diff --git a/shared-bindings/wiznet/wiznet5k.c b/shared-bindings/wiznet/wiznet5k.c
index ac89cc691..1b7f76e12 100644
--- a/shared-bindings/wiznet/wiznet5k.c
+++ b/shared-bindings/wiznet/wiznet5k.c
@@ -78,10 +78,10 @@ STATIC mp_obj_t wiznet5k_make_new(const mp_obj_type_t *type, size_t n_args, cons
mp_arg_val_t args[MP_ARRAY_SIZE(allowed_args)];
mp_arg_parse_all(n_args, pos_args, kw_args, MP_ARRAY_SIZE(allowed_args), allowed_args, args);
// TODO check type of ARG_spi?
- assert_pin(args[ARG_cs].u_obj, false);
- assert_pin(args[ARG_rst].u_obj, true); // may be NULL
+ const mcu_pin_obj_t *cs = validate_is_free_pin(args[ARG_cs].u_obj);
+ const mcu_pin_obj_t *rst = validate_is_free_pin_or_none(args[ARG_rst].u_obj);
- mp_obj_t ret = wiznet5k_create(args[ARG_spi].u_obj, args[ARG_cs].u_obj, args[ARG_rst].u_obj);
+ mp_obj_t ret = wiznet5k_create(args[ARG_spi].u_obj, cs, rst);
if (args[ARG_dhcp].u_bool) wiznet5k_start_dhcp();
return ret;
}