summaryrefslogtreecommitdiff
path: root/shared-module
diff options
context:
space:
mode:
authorRadomir Dopieralski <openstack@sheep.art.pl>2019-04-10 20:42:21 +0200
committerRadomir Dopieralski <openstack@sheep.art.pl>2019-04-12 20:43:29 +0200
commit6ff4e0ecb03f297d327c9c6fd3a52a7ad3a05c47 (patch)
tree822bb25bf3d7e1a026edaf72d1af885415bc8841 /shared-module
parent29615dae06c1846825b8a26fbfb834fea51687f5 (diff)
Add GamePadShift for handling shift-register-based buttons
Diffstat (limited to 'shared-module')
-rw-r--r--shared-module/gamepad/GamePad.c21
-rw-r--r--shared-module/gamepad/GamePad.h9
-rw-r--r--shared-module/gamepad/__init__.c36
3 files changed, 56 insertions, 10 deletions
diff --git a/shared-module/gamepad/GamePad.c b/shared-module/gamepad/GamePad.c
index 2c14fa02a..ed574db53 100644
--- a/shared-module/gamepad/GamePad.c
+++ b/shared-module/gamepad/GamePad.c
@@ -35,7 +35,7 @@
#include "shared-bindings/util.h"
-void gamepad_init(size_t n_pins, const mp_obj_t* pins) {
+void gamepad_init_pins(size_t n_pins, const mp_obj_t* pins) {
gamepad_obj_t* gamepad_singleton = MP_STATE_VM(gamepad_singleton);
for (size_t i = 0; i < 8; ++i) {
gamepad_singleton->pins[i] = NULL;
@@ -57,4 +57,23 @@ void gamepad_init(size_t n_pins, const mp_obj_t* pins) {
gamepad_singleton->pins[i] = pin;
}
gamepad_singleton->last = 0;
+ gamepad_singleton->kind = GAMEPAD_KIND_PINS;
+}
+
+void gamepad_init_shift(digitalio_digitalinout_obj_t *data_pin,
+ digitalio_digitalinout_obj_t *clock_pin,
+ digitalio_digitalinout_obj_t *latch_pin) {
+ gamepad_obj_t* gamepad_singleton = MP_STATE_VM(gamepad_singleton);
+
+ common_hal_digitalio_digitalinout_switch_to_input(data_pin, PULL_NONE);
+ gamepad_singleton->pins[0] = data_pin;
+
+ common_hal_digitalio_digitalinout_switch_to_output(clock_pin, 0, DRIVE_MODE_PUSH_PULL);
+ gamepad_singleton->pins[1] = clock_pin;
+
+ common_hal_digitalio_digitalinout_switch_to_output(clock_pin, 1, DRIVE_MODE_PUSH_PULL);
+ gamepad_singleton->pins[2] = latch_pin;
+
+ gamepad_singleton->last = 0;
+ gamepad_singleton->kind = GAMEPAD_KIND_PINS;
}
diff --git a/shared-module/gamepad/GamePad.h b/shared-module/gamepad/GamePad.h
index 9fd5c9626..9bc5a711c 100644
--- a/shared-module/gamepad/GamePad.h
+++ b/shared-module/gamepad/GamePad.h
@@ -37,8 +37,15 @@ typedef struct {
volatile uint8_t last;
volatile uint8_t pressed;
uint8_t pulls;
+ uint8_t kind;
} gamepad_obj_t;
-void gamepad_init(size_t n_pins, const mp_obj_t* pins);
+#define GAMEPAD_KIND_PINS 0
+#define GAMEPAD_KIND_SHIFT 1
+
+void gamepad_init_pins(size_t n_pins, const mp_obj_t* pins);
+void gamepad_init_shift(digitalio_digitalinout_obj_t *data_pin,
+ digitalio_digitalinout_obj_t *clock_pin,
+ digitalio_digitalinout_obj_t *latch_pin);
#endif // MICROPY_INCLUDED_GAMEPAD_GAMEPAD_H
diff --git a/shared-module/gamepad/__init__.c b/shared-module/gamepad/__init__.c
index 8414ddfbe..c79ee30ba 100644
--- a/shared-module/gamepad/__init__.c
+++ b/shared-module/gamepad/__init__.c
@@ -40,17 +40,37 @@ void gamepad_tick(void) {
}
uint8_t gamepad_current = 0;
uint8_t bit = 1;
- for (int i = 0; i < 8; ++i) {
- digitalio_digitalinout_obj_t* pin = gamepad_singleton->pins[i];
- if (!pin) {
- break;
+ switch (gamepad_singleton->kind) {
+ case GAMEPAD_KIND_PINS:
+ 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)) {
+ gamepad_current |= bit;
+ }
+ bit <<= 1;
}
- if (common_hal_digitalio_digitalinout_get_value(pin)) {
- gamepad_current |= bit;
+ gamepad_current ^= gamepad_singleton->pulls;
+ break;
+ case GAMEPAD_KIND_SHIFT:
+ bit = 1;
+ 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, 0);
+ for (int i = 0; i < 8; ++i) {
+ common_hal_digitalio_digitalinout_set_value(clock_pin, 1);
+ if (common_hal_digitalio_digitalinout_get_value(data_pin)) {
+ gamepad_current |= bit;
+ }
+ bit <<= 1;
+ common_hal_digitalio_digitalinout_set_value(clock_pin, 0);
}
- bit <<= 1;
+ common_hal_digitalio_digitalinout_set_value(latch_pin, 1);
+ break;
}
- gamepad_current ^= gamepad_singleton->pulls;
gamepad_singleton->pressed |= gamepad_singleton->last & gamepad_current;
gamepad_singleton->last = gamepad_current;
}