diff options
| author | Radomir Dopieralski <openstack@sheep.art.pl> | 2019-04-11 11:22:46 +0200 |
|---|---|---|
| committer | Radomir Dopieralski <openstack@sheep.art.pl> | 2019-04-12 20:43:29 +0200 |
| commit | 7e89beeb3101ddb7fc1d3f35d492943ffb287ec2 (patch) | |
| tree | b816e25ccf42ebcd60a4db8215a06d63dd580197 /shared-module/gamepad | |
| parent | 3469b1ec5d4d87fe5f4ade210b0700b7825db1c9 (diff) | |
Optimize the size of code for gamepad
Diffstat (limited to 'shared-module/gamepad')
| -rw-r--r-- | shared-module/gamepad/__init__.c | 68 |
1 files changed, 27 insertions, 41 deletions
diff --git a/shared-module/gamepad/__init__.c b/shared-module/gamepad/__init__.c index 1d9b25cee..24c299f86 100644 --- a/shared-module/gamepad/__init__.c +++ b/shared-module/gamepad/__init__.c @@ -33,58 +33,44 @@ #include "shared-bindings/digitalio/DigitalInOut.h" -STATIC uint8_t pressed_pins(gamepad_obj_t *self) { - uint8_t current = 0; - uint8_t bit = 1; - for (int i = 0; i < 8; ++i) { - digitalio_digitalinout_obj_t* pin = self->pins[i]; - if (!pin) { - break; - } - if (common_hal_digitalio_digitalinout_get_value(pin)) { - current |= bit; - } - bit <<= 1; - } - current ^= self->pulls; - return current; -} - - -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]; - digitalio_digitalinout_obj_t* latch_pin = self->pins[2]; - - common_hal_digitalio_digitalinout_set_value(latch_pin, 1); - 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)) { - 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; + uint8_t bit = 1; gamepad_obj_t* gamepad_singleton = MP_STATE_VM(gamepad_singleton); if (!gamepad_singleton) { return; } switch (gamepad_singleton->kind) { case GAMEPAD_KIND_PINS: - current = pressed_pins(gamepad_singleton); + 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)) { + current |= bit; + } + bit <<= 1; + } + current ^= gamepad_singleton->pulls; break; case GAMEPAD_KIND_SHIFT: - current = pressed_shift(gamepad_singleton); + bit = 1; // we need a statement after a label + 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, 1); + 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)) { + current |= bit; + } + bit <<= 1; + common_hal_digitalio_digitalinout_set_value(clock_pin, 1); + } + common_hal_digitalio_digitalinout_set_value(latch_pin, 0); break; } gamepad_singleton->pressed |= last & current; |
