diff options
| author | Radomir Dopieralski <openstack@sheep.art.pl> | 2019-04-10 20:42:21 +0200 |
|---|---|---|
| committer | Radomir Dopieralski <openstack@sheep.art.pl> | 2019-04-12 20:43:29 +0200 |
| commit | 6ff4e0ecb03f297d327c9c6fd3a52a7ad3a05c47 (patch) | |
| tree | 822bb25bf3d7e1a026edaf72d1af885415bc8841 /shared-module | |
| parent | 29615dae06c1846825b8a26fbfb834fea51687f5 (diff) | |
Add GamePadShift for handling shift-register-based buttons
Diffstat (limited to 'shared-module')
| -rw-r--r-- | shared-module/gamepad/GamePad.c | 21 | ||||
| -rw-r--r-- | shared-module/gamepad/GamePad.h | 9 | ||||
| -rw-r--r-- | shared-module/gamepad/__init__.c | 36 |
3 files changed, 56 insertions, 10 deletions
diff --git a/shared-module/gamepad/GamePad.c b/shared-module/gamepad/GamePad.c index 2c14fa02a..ed574db53 100644 --- a/shared-module/gamepad/GamePad.c +++ b/shared-module/gamepad/GamePad.c @@ -35,7 +35,7 @@ #include "shared-bindings/util.h" -void gamepad_init(size_t n_pins, const mp_obj_t* pins) { +void gamepad_init_pins(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; @@ -57,4 +57,23 @@ void gamepad_init(size_t n_pins, const mp_obj_t* pins) { gamepad_singleton->pins[i] = pin; } gamepad_singleton->last = 0; + gamepad_singleton->kind = GAMEPAD_KIND_PINS; +} + +void gamepad_init_shift(digitalio_digitalinout_obj_t *data_pin, + digitalio_digitalinout_obj_t *clock_pin, + digitalio_digitalinout_obj_t *latch_pin) { + gamepad_obj_t* gamepad_singleton = MP_STATE_VM(gamepad_singleton); + + common_hal_digitalio_digitalinout_switch_to_input(data_pin, PULL_NONE); + gamepad_singleton->pins[0] = data_pin; + + common_hal_digitalio_digitalinout_switch_to_output(clock_pin, 0, DRIVE_MODE_PUSH_PULL); + gamepad_singleton->pins[1] = clock_pin; + + common_hal_digitalio_digitalinout_switch_to_output(clock_pin, 1, DRIVE_MODE_PUSH_PULL); + gamepad_singleton->pins[2] = latch_pin; + + gamepad_singleton->last = 0; + gamepad_singleton->kind = GAMEPAD_KIND_PINS; } diff --git a/shared-module/gamepad/GamePad.h b/shared-module/gamepad/GamePad.h index 9fd5c9626..9bc5a711c 100644 --- a/shared-module/gamepad/GamePad.h +++ b/shared-module/gamepad/GamePad.h @@ -37,8 +37,15 @@ typedef struct { volatile uint8_t last; volatile uint8_t pressed; uint8_t pulls; + uint8_t kind; } gamepad_obj_t; -void gamepad_init(size_t n_pins, const mp_obj_t* pins); +#define GAMEPAD_KIND_PINS 0 +#define GAMEPAD_KIND_SHIFT 1 + +void gamepad_init_pins(size_t n_pins, const mp_obj_t* pins); +void gamepad_init_shift(digitalio_digitalinout_obj_t *data_pin, + digitalio_digitalinout_obj_t *clock_pin, + digitalio_digitalinout_obj_t *latch_pin); #endif // MICROPY_INCLUDED_GAMEPAD_GAMEPAD_H diff --git a/shared-module/gamepad/__init__.c b/shared-module/gamepad/__init__.c index 8414ddfbe..c79ee30ba 100644 --- a/shared-module/gamepad/__init__.c +++ b/shared-module/gamepad/__init__.c @@ -40,17 +40,37 @@ void gamepad_tick(void) { } uint8_t gamepad_current = 0; uint8_t bit = 1; - for (int i = 0; i < 8; ++i) { - digitalio_digitalinout_obj_t* pin = gamepad_singleton->pins[i]; - if (!pin) { - break; + switch (gamepad_singleton->kind) { + case GAMEPAD_KIND_PINS: + for (int i = 0; i < 8; ++i) { + digitalio_digitalinout_obj_t* pin = gamepad_singleton->pins[i]; + if (!pin) { + break; + } + if (common_hal_digitalio_digitalinout_get_value(pin)) { + gamepad_current |= bit; + } + bit <<= 1; } - if (common_hal_digitalio_digitalinout_get_value(pin)) { - gamepad_current |= bit; + gamepad_current ^= gamepad_singleton->pulls; + break; + case GAMEPAD_KIND_SHIFT: + bit = 1; + digitalio_digitalinout_obj_t* data_pin = gamepad_singleton->pins[0]; + digitalio_digitalinout_obj_t* clock_pin = gamepad_singleton->pins[1]; + digitalio_digitalinout_obj_t* latch_pin = gamepad_singleton->pins[2]; + common_hal_digitalio_digitalinout_set_value(latch_pin, 0); + for (int i = 0; i < 8; ++i) { + common_hal_digitalio_digitalinout_set_value(clock_pin, 1); + if (common_hal_digitalio_digitalinout_get_value(data_pin)) { + gamepad_current |= bit; + } + bit <<= 1; + common_hal_digitalio_digitalinout_set_value(clock_pin, 0); } - bit <<= 1; + common_hal_digitalio_digitalinout_set_value(latch_pin, 1); + break; } - gamepad_current ^= gamepad_singleton->pulls; gamepad_singleton->pressed |= gamepad_singleton->last & gamepad_current; gamepad_singleton->last = gamepad_current; } |
