diff options
| author | Scott Shawcroft <scott@tannewt.org> | 2018-04-01 22:58:25 -0700 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2018-04-01 22:58:25 -0700 |
| commit | fc9340ca1726e1961755f9a6241d7b0fada7484e (patch) | |
| tree | 124b3c1f666de6d2befdf27b671da19de90494e0 | |
| parent | 630352c25d0e448f9f03ab70ad9c2908e3ff41a9 (diff) | |
| parent | 280374fa63e284f272b714358aac32b75a4bee6a (diff) | |
Merge pull request #733 from pewpew-game/gamepad-pull
Respect pin's pull in gamepad
| -rw-r--r-- | shared-module/gamepad/GamePad.c | 8 | ||||
| -rw-r--r-- | shared-module/gamepad/__init__.c | 6 |
2 files changed, 11 insertions, 3 deletions
diff --git a/shared-module/gamepad/GamePad.c b/shared-module/gamepad/GamePad.c index 3a2b8a3fe..cd1df9b57 100644 --- a/shared-module/gamepad/GamePad.c +++ b/shared-module/gamepad/GamePad.c @@ -31,6 +31,7 @@ #include "shared-bindings/digitalio/Pull.h" #include "shared-bindings/digitalio/DigitalInOut.h" +#include "shared-bindings/util.h" void gamepad_init(size_t n_pins, const mp_obj_t* pins) { @@ -39,8 +40,13 @@ void gamepad_init(size_t n_pins, const mp_obj_t* pins) { } for (size_t i=0; i<n_pins; ++i) { digitalio_digitalinout_obj_t *pin = MP_OBJ_TO_PTR(pins[i]); + raise_error_if_deinited(common_hal_digitalio_digitalinout_deinited(pin)); + digitalio_direction_t direction = common_hal_digitalio_digitalinout_get_direction(pin); + digitalio_pull_t pull = common_hal_digitalio_digitalinout_get_pull(pin); + if (direction != DIRECTION_INPUT || pull == PULL_NONE) { + common_hal_digitalio_digitalinout_switch_to_input(pin, PULL_UP); + } gamepad_singleton->pins[i] = pin; - common_hal_digitalio_digitalinout_switch_to_input(pin, PULL_UP); } gamepad_singleton->last = 0; } diff --git a/shared-module/gamepad/__init__.c b/shared-module/gamepad/__init__.c index b6c8be215..591a2fa0a 100644 --- a/shared-module/gamepad/__init__.c +++ b/shared-module/gamepad/__init__.c @@ -42,8 +42,10 @@ void gamepad_tick(void) { if (!pin) { break; } - if (!common_hal_digitalio_digitalinout_get_value(pin)) { - gamepad_current |= 1<<i; + 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; } } gamepad_singleton->pressed |= gamepad_singleton->last & gamepad_current; |
