diff options
| author | Dan Halbert <halbert@halwitz.org> | 2018-05-23 16:26:20 -0400 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2018-05-23 16:26:20 -0400 |
| commit | ff592ac791d041fb3cea6c08d2acd14748ed99b5 (patch) | |
| tree | de6ebc2b38934be58cadb47f436446e93bc72b72 | |
| parent | 8e6feecf11afbaa676098e733c91fa73f39c5e4e (diff) | |
| parent | 42e36a883b4145e9f8b70022d6f13ceaab4fca2c (diff) | |
Merge pull request #864 from pewpew-game/master
Multiple fixes in gamepad
| -rw-r--r-- | shared-bindings/gamepad/GamePad.c | 21 | ||||
| -rw-r--r-- | shared-module/gamepad/GamePad.c | 16 | ||||
| -rw-r--r-- | shared-module/gamepad/GamePad.h | 1 | ||||
| -rw-r--r-- | shared-module/gamepad/__init__.c | 11 |
4 files changed, 31 insertions, 18 deletions
diff --git a/shared-bindings/gamepad/GamePad.c b/shared-bindings/gamepad/GamePad.c index d80d1fcf6..99fdbb64a 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,20 @@ gamepad_obj_t* 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; + if (n_args > 8) { + mp_raise_TypeError("too many arguments"); } 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); @@ -119,9 +125,8 @@ 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 *self = MP_OBJ_TO_PTR(self_in); - mp_obj_t gamepad = MP_OBJ_NEW_SMALL_INT(self->pressed); - self->pressed = 0; + mp_obj_t gamepad = MP_OBJ_NEW_SMALL_INT(gamepad_singleton->pressed); + gamepad_singleton->pressed = 0; return gamepad; } MP_DEFINE_CONST_FUN_OBJ_1(gamepad_get_pressed_obj, gamepad_get_pressed); diff --git a/shared-module/gamepad/GamePad.c b/shared-module/gamepad/GamePad.c index cd1df9b57..88ab23fc1 100644 --- a/shared-module/gamepad/GamePad.c +++ b/shared-module/gamepad/GamePad.c @@ -35,17 +35,23 @@ 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; } - for (size_t i=0; i<n_pins; ++i) { + gamepad_singleton->pulls = 0; + 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) { + if (direction != DIRECTION_INPUT) { common_hal_digitalio_digitalinout_switch_to_input(pin, PULL_UP); } + digitalio_pull_t pull = common_hal_digitalio_digitalinout_get_pull(pin); + if (pull == PULL_NONE) { + common_hal_digitalio_digitalinout_set_pull(pin, PULL_UP); + } + if (pull != PULL_DOWN) { + gamepad_singleton->pulls |= 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..7ce55cf98 100644 --- a/shared-module/gamepad/GamePad.h +++ b/shared-module/gamepad/GamePad.h @@ -36,6 +36,7 @@ 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; 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; } |
