Skip to content

Commit 52d05bb

Browse files
committed
Cache pullup state in gamepad
Don't check the pin's pull direction on every tick, instead cache it at the beginning. Also avoid a "can't get pull of output pin" error when one of the pins passed is in output mode.
1 parent e274a02 commit 52d05bb

4 files changed

Lines changed: 18 additions & 9 deletions

File tree

shared-bindings/gamepad/GamePad.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@
3131
#include "GamePad.h"
3232

3333

34-
gamepad_obj_t* gamepad_singleton = NULL;
34+
gamepad_obj_t* volatile gamepad_singleton = NULL;
3535

3636
//| .. currentmodule:: gamepad
3737
//|

shared-module/gamepad/GamePad.c

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,14 +38,21 @@ void gamepad_init(size_t n_pins, const mp_obj_t* pins) {
3838
for (size_t i=0; i<8; ++i) {
3939
gamepad_singleton->pins[i] = NULL;
4040
}
41+
gamepad_singleton->pulls = 0;
4142
for (size_t i=0; i<n_pins; ++i) {
4243
digitalio_digitalinout_obj_t *pin = MP_OBJ_TO_PTR(pins[i]);
4344
raise_error_if_deinited(common_hal_digitalio_digitalinout_deinited(pin));
4445
digitalio_direction_t direction = common_hal_digitalio_digitalinout_get_direction(pin);
45-
digitalio_pull_t pull = common_hal_digitalio_digitalinout_get_pull(pin);
46-
if (direction != DIRECTION_INPUT || pull == PULL_NONE) {
46+
if (direction != DIRECTION_INPUT) {
4747
common_hal_digitalio_digitalinout_switch_to_input(pin, PULL_UP);
4848
}
49+
digitalio_pull_t pull = common_hal_digitalio_digitalinout_get_pull(pin);
50+
if (pull == PULL_NONE) {
51+
common_hal_digitalio_digitalinout_set_pull(pin, PULL_UP);
52+
}
53+
if (pull != PULL_DOWN) {
54+
gamepad_singleton->pulls |= 1 << i;
55+
}
4956
gamepad_singleton->pins[i] = pin;
5057
}
5158
gamepad_singleton->last = 0;

shared-module/gamepad/GamePad.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,9 +36,10 @@ typedef struct {
3636
digitalio_digitalinout_obj_t* pins[8];
3737
volatile uint8_t last;
3838
volatile uint8_t pressed;
39+
uint8_t pulls;
3940
} gamepad_obj_t;
4041

41-
extern gamepad_obj_t* gamepad_singleton;
42+
extern gamepad_obj_t* volatile gamepad_singleton;
4243

4344
void gamepad_init(size_t n_pins, const mp_obj_t* pins);
4445

shared-module/gamepad/__init__.c

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -37,17 +37,18 @@ void gamepad_tick(void) {
3737
return;
3838
}
3939
uint8_t gamepad_current = 0;
40-
for (int i=0; i<8; ++i) {
40+
uint8_t bit = 1;
41+
for (int i = 0; i < 8; ++i) {
4142
digitalio_digitalinout_obj_t* pin = gamepad_singleton->pins[i];
4243
if (!pin) {
4344
break;
4445
}
45-
digitalio_pull_t pull = common_hal_digitalio_digitalinout_get_pull(pin);
46-
bool value = common_hal_digitalio_digitalinout_get_value(pin);
47-
if ((pull == PULL_UP && !value) || (pull == PULL_DOWN && value)) {
48-
gamepad_current |= 1 << i;
46+
if (common_hal_digitalio_digitalinout_get_value(pin)) {
47+
gamepad_current |= bit;
4948
}
49+
bit <<= 1;
5050
}
51+
gamepad_current ^= gamepad_singleton->pulls;
5152
gamepad_singleton->pressed |= gamepad_singleton->last & gamepad_current;
5253
gamepad_singleton->last = gamepad_current;
5354
}

0 commit comments

Comments
 (0)