File tree Expand file tree Collapse file tree
Expand file tree Collapse file tree Original file line number Diff line number Diff line change 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//|
Original file line number Diff line number Diff 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 ;
Original file line number Diff line number Diff 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
4344void gamepad_init (size_t n_pins , const mp_obj_t * pins );
4445
Original file line number Diff line number Diff 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}
You can’t perform that action at this time.
0 commit comments