Skip to content

Commit a792593

Browse files
committed
Read one bit per system clock tick in GamePadShift
1 parent 6ff4e0e commit a792593

4 files changed

Lines changed: 53 additions & 33 deletions

File tree

shared-bindings/gamepad/GamePad.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -151,7 +151,7 @@ STATIC mp_obj_t gamepadshift_make_new(const mp_obj_type_t *type, size_t n_args,
151151

152152
if (!MP_STATE_VM(gamepad_singleton)) {
153153
gamepad_obj_t* gamepad_singleton = m_new_obj(gamepad_obj_t);
154-
gamepad_singleton->base.type = &gamepad_type;
154+
gamepad_singleton->base.type = &gamepadshift_type;
155155
MP_STATE_VM(gamepad_singleton) = gc_make_long_lived(gamepad_singleton);
156156
}
157157
gamepad_init_shift(data_pin, clock_pin, latch_pin);

shared-module/gamepad/GamePad.c

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,6 @@ void gamepad_init_pins(size_t n_pins, const mp_obj_t* pins) {
5656
}
5757
gamepad_singleton->pins[i] = pin;
5858
}
59-
gamepad_singleton->last = 0;
6059
gamepad_singleton->kind = GAMEPAD_KIND_PINS;
6160
}
6261

@@ -74,6 +73,5 @@ void gamepad_init_shift(digitalio_digitalinout_obj_t *data_pin,
7473
common_hal_digitalio_digitalinout_switch_to_output(clock_pin, 1, DRIVE_MODE_PUSH_PULL);
7574
gamepad_singleton->pins[2] = latch_pin;
7675

77-
gamepad_singleton->last = 0;
7876
gamepad_singleton->kind = GAMEPAD_KIND_PINS;
7977
}

shared-module/gamepad/GamePad.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,6 @@
3434
typedef struct {
3535
mp_obj_base_t base;
3636
digitalio_digitalinout_obj_t* pins[8];
37-
volatile uint8_t last;
3837
volatile uint8_t pressed;
3938
uint8_t pulls;
4039
uint8_t kind;

shared-module/gamepad/__init__.c

Lines changed: 52 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -33,46 +33,69 @@
3333
#include "shared-bindings/digitalio/DigitalInOut.h"
3434

3535

36+
void pressed_pins(gamepad_obj_t *self) {
37+
static uint8_t last = 0;
38+
uint8_t current = 0;
39+
uint8_t bit = 1;
40+
for (int i = 0; i < 8; ++i) {
41+
digitalio_digitalinout_obj_t* pin = self->pins[i];
42+
if (!pin) {
43+
break;
44+
}
45+
if (common_hal_digitalio_digitalinout_get_value(pin)) {
46+
current |= bit;
47+
}
48+
bit <<= 1;
49+
}
50+
current ^= self->pulls;
51+
self->pressed |= last & current;
52+
last = current;
53+
}
54+
55+
56+
void pressed_shift(gamepad_obj_t *self) {
57+
static volatile uint8_t i = 8;
58+
static volatile uint8_t clock = 0;
59+
digitalio_digitalinout_obj_t* data_pin = self->pins[0];
60+
digitalio_digitalinout_obj_t* clock_pin = self->pins[1];
61+
digitalio_digitalinout_obj_t* latch_pin = self->pins[2];
62+
63+
if (clock == 0) {
64+
common_hal_digitalio_digitalinout_set_value(clock_pin, 1);
65+
clock = 1;
66+
return;
67+
}
68+
69+
if (i == 8) {
70+
common_hal_digitalio_digitalinout_set_value(latch_pin, 0);
71+
i = 9;
72+
} else if (i == 9) {
73+
common_hal_digitalio_digitalinout_set_value(latch_pin, 1);
74+
i = 0;
75+
} else {
76+
if (common_hal_digitalio_digitalinout_get_value(data_pin)) {
77+
self->pressed |= (1 << i);
78+
}
79+
i += 1;
80+
}
81+
common_hal_digitalio_digitalinout_set_value(clock_pin, 0);
82+
clock = 0;
83+
}
84+
85+
3686
void gamepad_tick(void) {
3787
gamepad_obj_t* gamepad_singleton = MP_STATE_VM(gamepad_singleton);
3888
if (!gamepad_singleton) {
3989
return;
4090
}
41-
uint8_t gamepad_current = 0;
42-
uint8_t bit = 1;
4391
switch (gamepad_singleton->kind) {
4492
case GAMEPAD_KIND_PINS:
45-
for (int i = 0; i < 8; ++i) {
46-
digitalio_digitalinout_obj_t* pin = gamepad_singleton->pins[i];
47-
if (!pin) {
48-
break;
49-
}
50-
if (common_hal_digitalio_digitalinout_get_value(pin)) {
51-
gamepad_current |= bit;
52-
}
53-
bit <<= 1;
54-
}
55-
gamepad_current ^= gamepad_singleton->pulls;
93+
pressed_pins(gamepad_singleton);
5694
break;
5795
case GAMEPAD_KIND_SHIFT:
58-
bit = 1;
59-
digitalio_digitalinout_obj_t* data_pin = gamepad_singleton->pins[0];
60-
digitalio_digitalinout_obj_t* clock_pin = gamepad_singleton->pins[1];
61-
digitalio_digitalinout_obj_t* latch_pin = gamepad_singleton->pins[2];
62-
common_hal_digitalio_digitalinout_set_value(latch_pin, 0);
63-
for (int i = 0; i < 8; ++i) {
64-
common_hal_digitalio_digitalinout_set_value(clock_pin, 1);
65-
if (common_hal_digitalio_digitalinout_get_value(data_pin)) {
66-
gamepad_current |= bit;
67-
}
68-
bit <<= 1;
69-
common_hal_digitalio_digitalinout_set_value(clock_pin, 0);
70-
}
71-
common_hal_digitalio_digitalinout_set_value(latch_pin, 1);
96+
pressed_shift(gamepad_singleton);
7297
break;
7398
}
74-
gamepad_singleton->pressed |= gamepad_singleton->last & gamepad_current;
75-
gamepad_singleton->last = gamepad_current;
7699
}
77100

78101
void gamepad_reset(void) {

0 commit comments

Comments
 (0)