Skip to content

Commit ff592ac

Browse files
authored
Merge pull request adafruit#864 from pewpew-game/master
Multiple fixes in gamepad
2 parents 8e6feec + 42e36a8 commit ff592ac

4 files changed

Lines changed: 31 additions & 18 deletions

File tree

shared-bindings/gamepad/GamePad.c

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
#include "py/mphal.h"
2929
#include "shared-module/gamepad/GamePad.h"
3030
#include "shared-bindings/digitalio/DigitalInOut.h"
31+
#include "shared-bindings/util.h"
3132
#include "GamePad.h"
3233

3334

@@ -93,15 +94,20 @@ gamepad_obj_t* gamepad_singleton = NULL;
9394
//|
9495
STATIC mp_obj_t gamepad_make_new(const mp_obj_type_t *type, size_t n_args,
9596
size_t n_kw, const mp_obj_t *args) {
96-
if (!gamepad_singleton) {
97-
gamepad_singleton = m_new_obj(gamepad_obj_t);
98-
gamepad_singleton->base.type = &gamepad_type;
97+
if (n_args > 8) {
98+
mp_raise_TypeError("too many arguments");
9999
}
100100
for (size_t i = 0; i < n_args; ++i) {
101101
if (!MP_OBJ_IS_TYPE(args[i], &digitalio_digitalinout_type)) {
102-
nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_TypeError,
103-
"Expected a %q", digitalio_digitalinout_type.name));
102+
mp_raise_TypeError("expected a DigitalInOut");
104103
}
104+
digitalio_digitalinout_obj_t *pin = MP_OBJ_TO_PTR(args[i]);
105+
raise_error_if_deinited(
106+
common_hal_digitalio_digitalinout_deinited(pin));
107+
}
108+
if (!gamepad_singleton) {
109+
gamepad_singleton = m_new_obj(gamepad_obj_t);
110+
gamepad_singleton->base.type = &gamepad_type;
105111
}
106112
gamepad_init(n_args, args);
107113
return MP_OBJ_FROM_PTR(gamepad_singleton);
@@ -119,9 +125,8 @@ STATIC mp_obj_t gamepad_make_new(const mp_obj_type_t *type, size_t n_args,
119125
//| held down) can be recorded for the next call.
120126
//|
121127
STATIC mp_obj_t gamepad_get_pressed(mp_obj_t self_in) {
122-
gamepad_obj_t *self = MP_OBJ_TO_PTR(self_in);
123-
mp_obj_t gamepad = MP_OBJ_NEW_SMALL_INT(self->pressed);
124-
self->pressed = 0;
128+
mp_obj_t gamepad = MP_OBJ_NEW_SMALL_INT(gamepad_singleton->pressed);
129+
gamepad_singleton->pressed = 0;
125130
return gamepad;
126131
}
127132
MP_DEFINE_CONST_FUN_OBJ_1(gamepad_get_pressed_obj, gamepad_get_pressed);

shared-module/gamepad/GamePad.c

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -35,17 +35,23 @@
3535

3636

3737
void gamepad_init(size_t n_pins, const mp_obj_t* pins) {
38-
for (size_t i=0; i<8; ++i) {
38+
for (size_t i = 0; i < 8; ++i) {
3939
gamepad_singleton->pins[i] = NULL;
4040
}
41-
for (size_t i=0; i<n_pins; ++i) {
41+
gamepad_singleton->pulls = 0;
42+
for (size_t i = 0; i < n_pins; ++i) {
4243
digitalio_digitalinout_obj_t *pin = MP_OBJ_TO_PTR(pins[i]);
43-
raise_error_if_deinited(common_hal_digitalio_digitalinout_deinited(pin));
4444
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) {
45+
if (direction != DIRECTION_INPUT) {
4746
common_hal_digitalio_digitalinout_switch_to_input(pin, PULL_UP);
4847
}
48+
digitalio_pull_t pull = common_hal_digitalio_digitalinout_get_pull(pin);
49+
if (pull == PULL_NONE) {
50+
common_hal_digitalio_digitalinout_set_pull(pin, PULL_UP);
51+
}
52+
if (pull != PULL_DOWN) {
53+
gamepad_singleton->pulls |= 1 << i;
54+
}
4955
gamepad_singleton->pins[i] = pin;
5056
}
5157
gamepad_singleton->last = 0;

shared-module/gamepad/GamePad.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ 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

4142
extern gamepad_obj_t* gamepad_singleton;

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)