diff options
| author | Radomir Dopieralski <openstack@sheep.art.pl> | 2019-04-11 10:26:13 +0200 |
|---|---|---|
| committer | Radomir Dopieralski <openstack@sheep.art.pl> | 2019-04-12 20:43:29 +0200 |
| commit | 3469b1ec5d4d87fe5f4ade210b0700b7825db1c9 (patch) | |
| tree | dfe786344c242a5d1666368fe8f8d8315984d16b /shared-module/gamepad | |
| parent | b485e45f4f75235e32d63ad311f26d20eac43c1c (diff) | |
Add debouncing to GamePadShift
Diffstat (limited to 'shared-module/gamepad')
| -rw-r--r-- | shared-module/gamepad/__init__.c | 20 |
1 files changed, 12 insertions, 8 deletions
diff --git a/shared-module/gamepad/__init__.c b/shared-module/gamepad/__init__.c index 705c1ef38..1d9b25cee 100644 --- a/shared-module/gamepad/__init__.c +++ b/shared-module/gamepad/__init__.c @@ -33,8 +33,7 @@ #include "shared-bindings/digitalio/DigitalInOut.h" -void pressed_pins(gamepad_obj_t *self) { - static uint8_t last = 0; +STATIC uint8_t pressed_pins(gamepad_obj_t *self) { uint8_t current = 0; uint8_t bit = 1; for (int i = 0; i < 8; ++i) { @@ -48,12 +47,12 @@ void pressed_pins(gamepad_obj_t *self) { bit <<= 1; } current ^= self->pulls; - self->pressed |= last & current; - last = current; + return current; } -void pressed_shift(gamepad_obj_t *self) { +STATIC uint8_t pressed_shift(gamepad_obj_t *self) { + uint8_t current = 0; uint8_t bit = 1; digitalio_digitalinout_obj_t* data_pin = self->pins[0]; digitalio_digitalinout_obj_t* clock_pin = self->pins[1]; @@ -63,28 +62,33 @@ void pressed_shift(gamepad_obj_t *self) { for (int i = 0; i < 8; ++i) { common_hal_digitalio_digitalinout_set_value(clock_pin, 0); if (common_hal_digitalio_digitalinout_get_value(data_pin)) { - self->pressed |= bit; + current |= bit; } bit <<= 1; common_hal_digitalio_digitalinout_set_value(clock_pin, 1); } common_hal_digitalio_digitalinout_set_value(latch_pin, 0); + return current; } void gamepad_tick(void) { + static uint8_t last = 0; + uint8_t current = 0; gamepad_obj_t* gamepad_singleton = MP_STATE_VM(gamepad_singleton); if (!gamepad_singleton) { return; } switch (gamepad_singleton->kind) { case GAMEPAD_KIND_PINS: - pressed_pins(gamepad_singleton); + current = pressed_pins(gamepad_singleton); break; case GAMEPAD_KIND_SHIFT: - pressed_shift(gamepad_singleton); + current = pressed_shift(gamepad_singleton); break; } + gamepad_singleton->pressed |= last & current; + last = current; } void gamepad_reset(void) { |
