diff options
| author | Benjamin Shockley <benjaminshockley@hotmail.com> | 2020-08-20 13:48:15 -0500 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2020-08-20 13:48:15 -0500 |
| commit | 0084f0af24e4e219bc040c52ee723959423de6e2 (patch) | |
| tree | 1aebdb362f08bf6417caa87836e3e4e739afc964 /shared-module/gamepad | |
| parent | 9aebe2f1efc99871fcf283c304e3a8700050d736 (diff) | |
| parent | 4d7b9cde33934a44c4c905a49d2f831339fc8bd2 (diff) | |
Merge pull request #2 from adafruit/master
Master
Diffstat (limited to 'shared-module/gamepad')
| -rw-r--r-- | shared-module/gamepad/GamePad.c | 33 | ||||
| -rw-r--r-- | shared-module/gamepad/GamePad.h | 2 | ||||
| -rw-r--r-- | shared-module/gamepad/__init__.c | 29 |
3 files changed, 34 insertions, 30 deletions
diff --git a/shared-module/gamepad/GamePad.c b/shared-module/gamepad/GamePad.c index 2c14fa02a..7b4108eb2 100644 --- a/shared-module/gamepad/GamePad.c +++ b/shared-module/gamepad/GamePad.c @@ -24,27 +24,21 @@ * THE SOFTWARE. */ -#include <stdbool.h> - #include "py/mpstate.h" -#include "__init__.h" -#include "GamePad.h" - -#include "shared-bindings/digitalio/Pull.h" #include "shared-bindings/digitalio/DigitalInOut.h" -#include "shared-bindings/util.h" - +#include "shared-bindings/gamepad/GamePad.h" +#include "supervisor/shared/tick.h" -void gamepad_init(size_t n_pins, const mp_obj_t* pins) { - gamepad_obj_t* gamepad_singleton = MP_STATE_VM(gamepad_singleton); +void common_hal_gamepad_gamepad_init(gamepad_obj_t *gamepad, + const mp_obj_t pins[], size_t n_pins) { for (size_t i = 0; i < 8; ++i) { - gamepad_singleton->pins[i] = NULL; + gamepad->pins[i] = NULL; } - gamepad_singleton->pulls = 0; + gamepad->pulls = 0; for (size_t i = 0; i < n_pins; ++i) { digitalio_digitalinout_obj_t *pin = MP_OBJ_TO_PTR(pins[i]); - digitalio_direction_t direction = common_hal_digitalio_digitalinout_get_direction(pin); - if (direction != DIRECTION_INPUT) { + if (common_hal_digitalio_digitalinout_get_direction(pin) != + DIRECTION_INPUT) { common_hal_digitalio_digitalinout_switch_to_input(pin, PULL_UP); } digitalio_pull_t pull = common_hal_digitalio_digitalinout_get_pull(pin); @@ -52,9 +46,14 @@ void gamepad_init(size_t n_pins, const mp_obj_t* pins) { common_hal_digitalio_digitalinout_set_pull(pin, PULL_UP); } if (pull != PULL_DOWN) { - gamepad_singleton->pulls |= 1 << i; + gamepad->pulls |= 1 << i; } - gamepad_singleton->pins[i] = pin; + gamepad->pins[i] = pin; } - gamepad_singleton->last = 0; + gamepad->last = 0; +} + +void common_hal_gamepad_gamepad_deinit(gamepad_obj_t *self) { + MP_STATE_VM(gamepad_singleton) = NULL; + supervisor_disable_tick(); } diff --git a/shared-module/gamepad/GamePad.h b/shared-module/gamepad/GamePad.h index 9fd5c9626..048fbcd2b 100644 --- a/shared-module/gamepad/GamePad.h +++ b/shared-module/gamepad/GamePad.h @@ -39,6 +39,4 @@ typedef struct { uint8_t pulls; } gamepad_obj_t; -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 8414ddfbe..9874b2752 100644 --- a/shared-module/gamepad/__init__.c +++ b/shared-module/gamepad/__init__.c @@ -27,34 +27,41 @@ #include <stdbool.h> #include "py/mpstate.h" -#include "__init__.h" -#include "GamePad.h" +#include "shared-bindings/gamepad/__init__.h" +#include "shared-bindings/gamepad/GamePad.h" +#include "supervisor/shared/tick.h" #include "shared-bindings/digitalio/DigitalInOut.h" void gamepad_tick(void) { - gamepad_obj_t* gamepad_singleton = MP_STATE_VM(gamepad_singleton); - if (!gamepad_singleton) { + uint8_t current = 0; + uint8_t bit = 1; + + void* singleton = MP_STATE_VM(gamepad_singleton); + if (singleton == NULL || !MP_OBJ_IS_TYPE(MP_OBJ_FROM_PTR(singleton), &gamepad_type)) { return; } - uint8_t gamepad_current = 0; - uint8_t bit = 1; + + gamepad_obj_t *self = MP_OBJ_TO_PTR(singleton); for (int i = 0; i < 8; ++i) { - digitalio_digitalinout_obj_t* pin = gamepad_singleton->pins[i]; + digitalio_digitalinout_obj_t* pin = self->pins[i]; if (!pin) { break; } if (common_hal_digitalio_digitalinout_get_value(pin)) { - gamepad_current |= bit; + current |= bit; } bit <<= 1; } - gamepad_current ^= gamepad_singleton->pulls; - gamepad_singleton->pressed |= gamepad_singleton->last & gamepad_current; - gamepad_singleton->last = gamepad_current; + current ^= self->pulls; + self->pressed |= self->last & current; + self->last = current; } void gamepad_reset(void) { + if (MP_STATE_VM(gamepad_singleton)) { + supervisor_disable_tick(); + } MP_STATE_VM(gamepad_singleton) = NULL; } |
