From d6c26942a5fadeb95305c86a604233257a7858db Mon Sep 17 00:00:00 2001 From: Jerry Needell Date: Sun, 13 May 2018 21:54:44 -0400 Subject: add timeout keyword to I2C - for bitbangio - ignored for busio --- shared-module/bitbangio/I2C.c | 15 +++++++++++---- shared-module/bitbangio/types.h | 1 + shared-module/busio/I2C.c | 4 ++-- 3 files changed, 14 insertions(+), 6 deletions(-) (limited to 'shared-module') diff --git a/shared-module/bitbangio/I2C.c b/shared-module/bitbangio/I2C.c index 7eeda0e00..ac2f9aead 100644 --- a/shared-module/bitbangio/I2C.c +++ b/shared-module/bitbangio/I2C.c @@ -25,8 +25,8 @@ */ #include "shared-bindings/bitbangio/I2C.h" - #include "py/mperrno.h" +#include "py/nlr.h" #include "py/obj.h" #include "common-hal/microcontroller/Pin.h" @@ -34,7 +34,6 @@ #include "shared-bindings/digitalio/DigitalInOut.h" #include "shared-module/bitbangio/types.h" -#define I2C_STRETCH_LIMIT 255 STATIC void delay(bitbangio_i2c_obj_t *self) { // We need to use an accurate delay to get acceptable I2C @@ -48,11 +47,16 @@ STATIC void scl_low(bitbangio_i2c_obj_t *self) { STATIC void scl_release(bitbangio_i2c_obj_t *self) { common_hal_digitalio_digitalinout_set_value(&self->scl, true); + uint32_t count = self->us_timeout; delay(self); // For clock stretching, wait for the SCL pin to be released, with timeout. - for (int count = I2C_STRETCH_LIMIT; !common_hal_digitalio_digitalinout_get_value(&self->scl) && count; --count) { + for (; !common_hal_digitalio_digitalinout_get_value(&self->scl) && count; --count) { common_hal_mcu_delay_us(1); } + if(count==0) { /// raise exception on timeout + nlr_raise(mp_obj_new_exception_msg(&mp_type_TimeoutError, + "Clock Stretching Timeout.")); + } } STATIC void sda_low(bitbangio_i2c_obj_t *self) { @@ -142,7 +146,10 @@ STATIC bool read_byte(bitbangio_i2c_obj_t *self, uint8_t *val, bool ack) { void shared_module_bitbangio_i2c_construct(bitbangio_i2c_obj_t *self, const mcu_pin_obj_t * scl, const mcu_pin_obj_t * sda, - uint32_t frequency) { + uint32_t frequency, + uint32_t us_timeout) { + + self->us_timeout = us_timeout; self->us_delay = 500000 / frequency; if (self->us_delay == 0) { self->us_delay = 1; diff --git a/shared-module/bitbangio/types.h b/shared-module/bitbangio/types.h index dfe50f049..6d1723474 100644 --- a/shared-module/bitbangio/types.h +++ b/shared-module/bitbangio/types.h @@ -36,6 +36,7 @@ typedef struct { digitalio_digitalinout_obj_t scl; digitalio_digitalinout_obj_t sda; uint32_t us_delay; + uint32_t us_timeout; volatile bool locked; } bitbangio_i2c_obj_t; diff --git a/shared-module/busio/I2C.c b/shared-module/busio/I2C.c index 68d6ea22a..06e1af10a 100644 --- a/shared-module/busio/I2C.c +++ b/shared-module/busio/I2C.c @@ -30,8 +30,8 @@ #include "py/nlr.h" void common_hal_busio_i2c_construct(busio_i2c_obj_t *self, - const mcu_pin_obj_t* scl, const mcu_pin_obj_t* sda, uint32_t freq) { - shared_module_bitbangio_i2c_construct(&self->bitbang, scl, sda, freq); + const mcu_pin_obj_t* scl, const mcu_pin_obj_t* sda, uint32_t freq, uint32_t timeout) { + shared_module_bitbangio_i2c_construct(&self->bitbang, scl, sda, freq, timeout); } bool common_hal_busio_i2c_deinited(busio_i2c_obj_t *self) { -- cgit v1.2.3 From aa9309704bb174c351034a866bb6b5b7073463db Mon Sep 17 00:00:00 2001 From: Jerry Needell Date: Sun, 13 May 2018 22:21:05 -0400 Subject: revise to use mp_raise_msg insead of nlr_raise.... --- shared-module/bitbangio/I2C.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) (limited to 'shared-module') diff --git a/shared-module/bitbangio/I2C.c b/shared-module/bitbangio/I2C.c index ac2f9aead..8381f051a 100644 --- a/shared-module/bitbangio/I2C.c +++ b/shared-module/bitbangio/I2C.c @@ -28,6 +28,7 @@ #include "py/mperrno.h" #include "py/nlr.h" #include "py/obj.h" +#include "py/runtime.h" #include "common-hal/microcontroller/Pin.h" #include "shared-bindings/microcontroller/__init__.h" @@ -54,8 +55,8 @@ STATIC void scl_release(bitbangio_i2c_obj_t *self) { common_hal_mcu_delay_us(1); } if(count==0) { /// raise exception on timeout - nlr_raise(mp_obj_new_exception_msg(&mp_type_TimeoutError, - "Clock Stretching Timeout.")); + mp_raise_msg(&mp_type_TimeoutError, + "Clock Stretching Timeout."); } } -- cgit v1.2.3 From d9f1b1f5b786a1e11e41da10bddb404e0285987c Mon Sep 17 00:00:00 2001 From: Jerry Needell Date: Sun, 13 May 2018 22:32:32 -0400 Subject: remove #include py/nlr.h from I2C.c --- shared-module/bitbangio/I2C.c | 1 - 1 file changed, 1 deletion(-) (limited to 'shared-module') diff --git a/shared-module/bitbangio/I2C.c b/shared-module/bitbangio/I2C.c index 8381f051a..7bf8292db 100644 --- a/shared-module/bitbangio/I2C.c +++ b/shared-module/bitbangio/I2C.c @@ -26,7 +26,6 @@ #include "shared-bindings/bitbangio/I2C.h" #include "py/mperrno.h" -#include "py/nlr.h" #include "py/obj.h" #include "py/runtime.h" -- cgit v1.2.3 From 9a2cda7fd3917c3e4f57b4a8510bc7690945774a Mon Sep 17 00:00:00 2001 From: Scott Shawcroft Date: Wed, 16 May 2018 13:19:51 -0500 Subject: Reformat the error message --- shared-module/bitbangio/I2C.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'shared-module') diff --git a/shared-module/bitbangio/I2C.c b/shared-module/bitbangio/I2C.c index 7bf8292db..47529748a 100644 --- a/shared-module/bitbangio/I2C.c +++ b/shared-module/bitbangio/I2C.c @@ -53,9 +53,9 @@ STATIC void scl_release(bitbangio_i2c_obj_t *self) { for (; !common_hal_digitalio_digitalinout_get_value(&self->scl) && count; --count) { common_hal_mcu_delay_us(1); } - if(count==0) { /// raise exception on timeout - mp_raise_msg(&mp_type_TimeoutError, - "Clock Stretching Timeout."); + // raise exception on timeout + if (count == 0) { + mp_raise_msg(&mp_type_TimeoutError, "Clock stretch too long"); } } -- cgit v1.2.3 From 52d05bbc37d063a1fdc359b18b9b112665f92276 Mon Sep 17 00:00:00 2001 From: Radomir Dopieralski Date: Wed, 23 May 2018 11:26:16 +0200 Subject: Cache pullup state in gamepad Don't check the pin's pull direction on every tick, instead cache it at the beginning. Also avoid a "can't get pull of output pin" error when one of the pins passed is in output mode. --- shared-bindings/gamepad/GamePad.c | 2 +- shared-module/gamepad/GamePad.c | 11 +++++++++-- shared-module/gamepad/GamePad.h | 3 ++- shared-module/gamepad/__init__.c | 11 ++++++----- 4 files changed, 18 insertions(+), 9 deletions(-) (limited to 'shared-module') diff --git a/shared-bindings/gamepad/GamePad.c b/shared-bindings/gamepad/GamePad.c index d80d1fcf6..43efc3b18 100644 --- a/shared-bindings/gamepad/GamePad.c +++ b/shared-bindings/gamepad/GamePad.c @@ -31,7 +31,7 @@ #include "GamePad.h" -gamepad_obj_t* gamepad_singleton = NULL; +gamepad_obj_t* volatile gamepad_singleton = NULL; //| .. currentmodule:: gamepad //| diff --git a/shared-module/gamepad/GamePad.c b/shared-module/gamepad/GamePad.c index cd1df9b57..540c882da 100644 --- a/shared-module/gamepad/GamePad.c +++ b/shared-module/gamepad/GamePad.c @@ -38,14 +38,21 @@ void gamepad_init(size_t n_pins, const mp_obj_t* pins) { for (size_t i=0; i<8; ++i) { gamepad_singleton->pins[i] = NULL; } + gamepad_singleton->pulls = 0; for (size_t i=0; ipulls |= 1 << i; + } gamepad_singleton->pins[i] = pin; } gamepad_singleton->last = 0; diff --git a/shared-module/gamepad/GamePad.h b/shared-module/gamepad/GamePad.h index e5f709134..77fdb8b0a 100644 --- a/shared-module/gamepad/GamePad.h +++ b/shared-module/gamepad/GamePad.h @@ -36,9 +36,10 @@ typedef struct { digitalio_digitalinout_obj_t* pins[8]; volatile uint8_t last; volatile uint8_t pressed; + uint8_t pulls; } gamepad_obj_t; -extern gamepad_obj_t* gamepad_singleton; +extern gamepad_obj_t* volatile gamepad_singleton; void gamepad_init(size_t n_pins, const mp_obj_t* pins); diff --git a/shared-module/gamepad/__init__.c b/shared-module/gamepad/__init__.c index 591a2fa0a..b1cdac2a7 100644 --- a/shared-module/gamepad/__init__.c +++ b/shared-module/gamepad/__init__.c @@ -37,17 +37,18 @@ void gamepad_tick(void) { return; } uint8_t gamepad_current = 0; - for (int i=0; i<8; ++i) { + uint8_t bit = 1; + for (int i = 0; i < 8; ++i) { digitalio_digitalinout_obj_t* pin = gamepad_singleton->pins[i]; if (!pin) { break; } - digitalio_pull_t pull = common_hal_digitalio_digitalinout_get_pull(pin); - bool value = common_hal_digitalio_digitalinout_get_value(pin); - if ((pull == PULL_UP && !value) || (pull == PULL_DOWN && value)) { - gamepad_current |= 1 << i; + if (common_hal_digitalio_digitalinout_get_value(pin)) { + gamepad_current |= bit; } + bit <<= 1; } + gamepad_current ^= gamepad_singleton->pulls; gamepad_singleton->pressed |= gamepad_singleton->last & gamepad_current; gamepad_singleton->last = gamepad_current; } -- cgit v1.2.3 From 240678e71403f54ab31452a7138dfd8ddcfc7f0c Mon Sep 17 00:00:00 2001 From: Radomir Dopieralski Date: Wed, 23 May 2018 21:39:06 +0200 Subject: Avoid uninitialized gamepad on exception Raise exceptions before the gamepad_singleton is created. Also, use mp_raise for creating the exceptions. --- shared-bindings/gamepad/GamePad.c | 15 +++++++++------ shared-module/gamepad/GamePad.c | 5 ++--- 2 files changed, 11 insertions(+), 9 deletions(-) (limited to 'shared-module') diff --git a/shared-bindings/gamepad/GamePad.c b/shared-bindings/gamepad/GamePad.c index 2c982c7d5..aa645dc66 100644 --- a/shared-bindings/gamepad/GamePad.c +++ b/shared-bindings/gamepad/GamePad.c @@ -28,6 +28,7 @@ #include "py/mphal.h" #include "shared-module/gamepad/GamePad.h" #include "shared-bindings/digitalio/DigitalInOut.h" +#include "shared-bindings/util.h" #include "GamePad.h" @@ -93,15 +94,17 @@ gamepad_obj_t* volatile gamepad_singleton = NULL; //| STATIC mp_obj_t gamepad_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *args) { - if (!gamepad_singleton) { - gamepad_singleton = m_new_obj(gamepad_obj_t); - gamepad_singleton->base.type = &gamepad_type; - } for (size_t i = 0; i < n_args; ++i) { if (!MP_OBJ_IS_TYPE(args[i], &digitalio_digitalinout_type)) { - nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_TypeError, - "Expected a %q", digitalio_digitalinout_type.name)); + mp_raise_TypeError("Expected a DigitalInOut"); } + digitalio_digitalinout_obj_t *pin = MP_OBJ_TO_PTR(args[i]); + raise_error_if_deinited( + common_hal_digitalio_digitalinout_deinited(pin)); + } + if (!gamepad_singleton) { + gamepad_singleton = m_new_obj(gamepad_obj_t); + gamepad_singleton->base.type = &gamepad_type; } gamepad_init(n_args, args); return MP_OBJ_FROM_PTR(gamepad_singleton); diff --git a/shared-module/gamepad/GamePad.c b/shared-module/gamepad/GamePad.c index 540c882da..88ab23fc1 100644 --- a/shared-module/gamepad/GamePad.c +++ b/shared-module/gamepad/GamePad.c @@ -35,13 +35,12 @@ void gamepad_init(size_t n_pins, const mp_obj_t* pins) { - for (size_t i=0; i<8; ++i) { + for (size_t i = 0; i < 8; ++i) { gamepad_singleton->pins[i] = NULL; } gamepad_singleton->pulls = 0; - for (size_t i=0; i Date: Wed, 23 May 2018 21:49:20 +0200 Subject: Remove volatile from the gamepad struct --- shared-bindings/gamepad/GamePad.c | 2 +- shared-module/gamepad/GamePad.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) (limited to 'shared-module') diff --git a/shared-bindings/gamepad/GamePad.c b/shared-bindings/gamepad/GamePad.c index 80916d7f4..99fdbb64a 100644 --- a/shared-bindings/gamepad/GamePad.c +++ b/shared-bindings/gamepad/GamePad.c @@ -32,7 +32,7 @@ #include "GamePad.h" -gamepad_obj_t* volatile gamepad_singleton = NULL; +gamepad_obj_t* gamepad_singleton = NULL; //| .. currentmodule:: gamepad //| diff --git a/shared-module/gamepad/GamePad.h b/shared-module/gamepad/GamePad.h index 77fdb8b0a..7ce55cf98 100644 --- a/shared-module/gamepad/GamePad.h +++ b/shared-module/gamepad/GamePad.h @@ -39,7 +39,7 @@ typedef struct { uint8_t pulls; } gamepad_obj_t; -extern gamepad_obj_t* volatile gamepad_singleton; +extern gamepad_obj_t* gamepad_singleton; void gamepad_init(size_t n_pins, const mp_obj_t* pins); -- cgit v1.2.3 From b219ce6d377b6e00e1967c9b98966d4229f566ed Mon Sep 17 00:00:00 2001 From: Radomir Dopieralski Date: Thu, 24 May 2018 11:25:21 +0200 Subject: Add gamepad_singleton to root pointers --- ports/atmel-samd/mpconfigport.h | 1 + shared-bindings/gamepad/GamePad.c | 17 ++++++++--------- shared-module/gamepad/GamePad.c | 2 ++ shared-module/gamepad/GamePad.h | 2 -- shared-module/gamepad/__init__.c | 4 +++- 5 files changed, 14 insertions(+), 12 deletions(-) (limited to 'shared-module') diff --git a/ports/atmel-samd/mpconfigport.h b/ports/atmel-samd/mpconfigport.h index 15cb51404..cd05927b0 100644 --- a/ports/atmel-samd/mpconfigport.h +++ b/ports/atmel-samd/mpconfigport.h @@ -312,6 +312,7 @@ extern const struct _mp_obj_module_t usb_hid_module; mp_obj_t playing_audio[AUDIO_DMA_CHANNEL_COUNT]; \ mp_obj_t rtc_time_source; \ FLASH_ROOT_POINTERS \ + mp_obj_t gamepad_singleton; \ void run_background_tasks(void); #define MICROPY_VM_HOOK_LOOP run_background_tasks(); diff --git a/shared-bindings/gamepad/GamePad.c b/shared-bindings/gamepad/GamePad.c index b103c59b4..1e95776d7 100644 --- a/shared-bindings/gamepad/GamePad.c +++ b/shared-bindings/gamepad/GamePad.c @@ -27,14 +27,14 @@ #include "py/runtime.h" #include "py/mphal.h" #include "py/gc.h" +#include "py/mpstate.h" +#include "shared-module/gamepad/__init__.h" #include "shared-module/gamepad/GamePad.h" #include "shared-bindings/digitalio/DigitalInOut.h" #include "shared-bindings/util.h" #include "GamePad.h" -gamepad_obj_t* gamepad_singleton = NULL; - //| .. currentmodule:: gamepad //| //| :class:`GamePad` -- Scan buttons for presses @@ -106,13 +106,13 @@ STATIC mp_obj_t gamepad_make_new(const mp_obj_type_t *type, size_t n_args, raise_error_if_deinited( common_hal_digitalio_digitalinout_deinited(pin)); } - if (!gamepad_singleton) { - gamepad_singleton = m_new_obj(gamepad_obj_t); + if (!MP_STATE_VM(gamepad_singleton)) { + gamepad_obj_t* gamepad_singleton = m_new_obj(gamepad_obj_t); gamepad_singleton->base.type = &gamepad_type; - gamepad_singleton = gc_make_long_lived(gamepad_singleton); + MP_STATE_VM(gamepad_singleton) = gc_make_long_lived(gamepad_singleton); } gamepad_init(n_args, args); - return MP_OBJ_FROM_PTR(gamepad_singleton); + return MP_OBJ_FROM_PTR(MP_STATE_VM(gamepad_singleton)); } @@ -127,6 +127,7 @@ STATIC mp_obj_t gamepad_make_new(const mp_obj_type_t *type, size_t n_args, //| held down) can be recorded for the next call. //| STATIC mp_obj_t gamepad_get_pressed(mp_obj_t self_in) { + gamepad_obj_t* gamepad_singleton = MP_STATE_VM(gamepad_singleton); mp_obj_t gamepad = MP_OBJ_NEW_SMALL_INT(gamepad_singleton->pressed); gamepad_singleton->pressed = 0; return gamepad; @@ -139,14 +140,12 @@ MP_DEFINE_CONST_FUN_OBJ_1(gamepad_get_pressed_obj, gamepad_get_pressed); //| Disable button scanning. //| STATIC mp_obj_t gamepad_deinit(mp_obj_t self_in) { - gamepad_singleton = NULL; + gamepad_reset(); return mp_const_none; } MP_DEFINE_CONST_FUN_OBJ_1(gamepad_deinit_obj, gamepad_deinit); -STATIC mp_obj_t gamepad_make_new(const mp_obj_type_t *type, size_t n_args, - size_t n_kw, const mp_obj_t *args); STATIC const mp_rom_map_elem_t gamepad_locals_dict_table[] = { { MP_OBJ_NEW_QSTR(MP_QSTR_get_pressed), MP_ROM_PTR(&gamepad_get_pressed_obj)}, { MP_OBJ_NEW_QSTR(MP_QSTR_deinit), MP_ROM_PTR(&gamepad_deinit_obj)}, diff --git a/shared-module/gamepad/GamePad.c b/shared-module/gamepad/GamePad.c index 88ab23fc1..2c14fa02a 100644 --- a/shared-module/gamepad/GamePad.c +++ b/shared-module/gamepad/GamePad.c @@ -26,6 +26,7 @@ #include +#include "py/mpstate.h" #include "__init__.h" #include "GamePad.h" @@ -35,6 +36,7 @@ void gamepad_init(size_t n_pins, const mp_obj_t* pins) { + gamepad_obj_t* gamepad_singleton = MP_STATE_VM(gamepad_singleton); for (size_t i = 0; i < 8; ++i) { gamepad_singleton->pins[i] = NULL; } diff --git a/shared-module/gamepad/GamePad.h b/shared-module/gamepad/GamePad.h index 7ce55cf98..9fd5c9626 100644 --- a/shared-module/gamepad/GamePad.h +++ b/shared-module/gamepad/GamePad.h @@ -39,8 +39,6 @@ typedef struct { uint8_t pulls; } gamepad_obj_t; -extern gamepad_obj_t* gamepad_singleton; - void gamepad_init(size_t n_pins, const mp_obj_t* pins); #endif // MICROPY_INCLUDED_GAMEPAD_GAMEPAD_H diff --git a/shared-module/gamepad/__init__.c b/shared-module/gamepad/__init__.c index b1cdac2a7..8414ddfbe 100644 --- a/shared-module/gamepad/__init__.c +++ b/shared-module/gamepad/__init__.c @@ -26,6 +26,7 @@ #include +#include "py/mpstate.h" #include "__init__.h" #include "GamePad.h" @@ -33,6 +34,7 @@ void gamepad_tick(void) { + gamepad_obj_t* gamepad_singleton = MP_STATE_VM(gamepad_singleton); if (!gamepad_singleton) { return; } @@ -54,5 +56,5 @@ void gamepad_tick(void) { } void gamepad_reset(void) { - gamepad_singleton = NULL; + MP_STATE_VM(gamepad_singleton) = NULL; } -- cgit v1.2.3