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(-) 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