Skip to content

Commit c927e6b

Browse files
committed
Split GamePadShift from GamePad to save space on most boards.
1 parent eeef535 commit c927e6b

File tree

18 files changed

+236
-78
lines changed

18 files changed

+236
-78
lines changed

ports/atmel-samd/boards/pybadge/mpconfigboard.mk

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,5 +14,7 @@ CIRCUITPY_AUDIOBUSIO = 0
1414
# No touch on SAMD51 yet
1515
CIRCUITPY_TOUCHIO = 0
1616

17+
CIRCUITPY_GAMEPADSHIFT = 1
18+
1719
CHIP_VARIANT = SAMD51J19A
1820
CHIP_FAMILY = samd51

py/circuitpy_defns.mk

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -131,6 +131,10 @@ SRC_PATTERNS += frequencyio/%
131131
endif
132132
ifeq ($(CIRCUITPY_GAMEPAD),1)
133133
SRC_PATTERNS += gamepad/%
134+
# gamepadshift depends on gamepad
135+
ifeq ($(CIRCUITPY_GAMEPADSHIFT),1)
136+
SRC_PATTERNS += gamepadshift/%
137+
endif
134138
endif
135139
ifeq ($(CIRCUITPY_I2CSLAVE),1)
136140
SRC_PATTERNS += i2cslave/%
@@ -317,8 +321,9 @@ $(filter $(SRC_PATTERNS), \
317321
fontio/BuiltinFont.c \
318322
fontio/__init__.c \
319323
gamepad/GamePad.c \
320-
gamepad/GamePadShift.c \
321324
gamepad/__init__.c \
325+
gamepadshift/GamePadShift.c \
326+
gamepadshift/__init__.c \
322327
os/__init__.c \
323328
random/__init__.c \
324329
socket/__init__.c \

py/circuitpy_mpconfig.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -322,6 +322,13 @@ extern const struct _mp_obj_module_t gamepad_module;
322322
#define GAMEPAD_MODULE
323323
#endif
324324

325+
#if CIRCUITPY_GAMEPADSHIFT
326+
extern const struct _mp_obj_module_t gamepadshift_module;
327+
#define GAMEPADSHIFT_MODULE { MP_OBJ_NEW_QSTR(MP_QSTR_gamepadshift),(mp_obj_t)&gamepadshift_module },
328+
#else
329+
#define GAMEPADSHIFT_MODULE
330+
#endif
331+
325332
#if CIRCUITPY_I2CSLAVE
326333
extern const struct _mp_obj_module_t i2cslave_module;
327334
#define I2CSLAVE_MODULE { MP_OBJ_NEW_QSTR(MP_QSTR_i2cslave), (mp_obj_t)&i2cslave_module },
@@ -554,6 +561,7 @@ extern const struct _mp_obj_module_t ustack_module;
554561
ERRNO_MODULE \
555562
FREQUENCYIO_MODULE \
556563
GAMEPAD_MODULE \
564+
GAMEPADSHIFT_MODULE \
557565
I2CSLAVE_MODULE \
558566
JSON_MODULE \
559567
MATH_MODULE \

py/circuitpy_mpconfig.mk

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,11 @@ CIRCUITPY_GAMEPAD = $(CIRCUITPY_FULL_BUILD)
102102
endif
103103
CFLAGS += -DCIRCUITPY_GAMEPAD=$(CIRCUITPY_GAMEPAD)
104104

105+
ifndef CIRCUITPY_GAMEPADSHIFT
106+
CIRCUITPY_GAMEPADSHIFT = 0
107+
endif
108+
CFLAGS += -DCIRCUITPY_GAMEPADSHIFT=$(CIRCUITPY_GAMEPADSHIFT)
109+
105110
ifndef CIRCUITPY_I2CSLAVE
106111
CIRCUITPY_I2CSLAVE = $(CIRCUITPY_FULL_BUILD)
107112
endif

shared-bindings/gamepad/GamePad.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -100,7 +100,7 @@ STATIC mp_obj_t gamepad_make_new(const mp_obj_type_t *type, size_t n_args,
100100
mp_raise_TypeError(translate("argument num/types mismatch"));
101101
}
102102
for (size_t i = 0; i < n_args; ++i) {
103-
pin_io(args[i]);
103+
assert_digitalinout(args[i]);
104104
}
105105
gamepad_obj_t* gamepad_singleton = MP_STATE_VM(gamepad_singleton);
106106
if (!gamepad_singleton ||
@@ -110,7 +110,7 @@ STATIC mp_obj_t gamepad_make_new(const mp_obj_type_t *type, size_t n_args,
110110
gamepad_singleton = gc_make_long_lived(gamepad_singleton);
111111
MP_STATE_VM(gamepad_singleton) = gamepad_singleton;
112112
}
113-
gamepad_init(gamepad_singleton, args, n_args);
113+
common_hal_gamepad_gamepad_init(gamepad_singleton, args, n_args);
114114
return MP_OBJ_FROM_PTR(gamepad_singleton);
115115
}
116116

@@ -138,7 +138,7 @@ MP_DEFINE_CONST_FUN_OBJ_1(gamepad_get_pressed_obj, gamepad_get_pressed);
138138
//| Disable button scanning.
139139
//|
140140
STATIC mp_obj_t gamepad_deinit(mp_obj_t self_in) {
141-
gamepad_reset();
141+
common_hal_gamepad_gamepad_deinit(self_in);
142142
return mp_const_none;
143143
}
144144
MP_DEFINE_CONST_FUN_OBJ_1(gamepad_deinit_obj, gamepad_deinit);

shared-bindings/gamepad/GamePad.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,11 @@
2828
#ifndef MICROPY_INCLUDED_SHARED_BINDINGS_GAMEPAD_GAMEPAD_H
2929
#define MICROPY_INCLUDED_SHARED_BINDINGS_GAMEPAD_GAMEPAD_H
3030

31+
#include "shared-module/gamepad/GamePad.h"
32+
3133
extern const mp_obj_type_t gamepad_type;
3234

35+
void common_hal_gamepad_gamepad_init(gamepad_obj_t *gamepad, const mp_obj_t pins[], size_t n_pins);
36+
void common_hal_gamepad_gamepad_deinit(gamepad_obj_t *gamepad);
37+
3338
#endif // MICROPY_INCLUDED_SHARED_BINDINGS_GAMEPAD_GAMEPAD_H

shared-bindings/gamepad/__init__.c

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -26,14 +26,12 @@
2626
#include "py/obj.h"
2727
#include "py/runtime.h"
2828
#include "py/mphal.h"
29-
#include "GamePad.h"
30-
#include "GamePadShift.h"
31-
#include "shared-bindings/digitalio/DigitalInOut.h"
29+
#include "shared-bindings/gamepad/GamePad.h"
3230
#include "shared-bindings/util.h"
3331

3432

3533
// Helper for validating digitalio.DigitalInOut arguments
36-
digitalio_digitalinout_obj_t *pin_io(mp_obj_t obj) {
34+
digitalio_digitalinout_obj_t *assert_digitalinout(mp_obj_t obj) {
3735
if (!MP_OBJ_IS_TYPE(obj, &digitalio_digitalinout_type)) {
3836
mp_raise_TypeError(translate("argument num/types mismatch"));
3937
}
@@ -55,12 +53,10 @@ digitalio_digitalinout_obj_t *pin_io(mp_obj_t obj) {
5553
//| :maxdepth: 3
5654
//|
5755
//| GamePad
58-
//| GamePadShift
5956
//|
6057
STATIC const mp_rom_map_elem_t gamepad_module_globals_table[] = {
6158
{ MP_ROM_QSTR(MP_QSTR___name__), MP_ROM_QSTR(MP_QSTR_gamepad) },
6259
{ MP_OBJ_NEW_QSTR(MP_QSTR_GamePad), MP_ROM_PTR(&gamepad_type)},
63-
{ MP_OBJ_NEW_QSTR(MP_QSTR_GamePadShift), MP_ROM_PTR(&gamepadshift_type)},
6460
};
6561
STATIC MP_DEFINE_CONST_DICT(gamepad_module_globals,
6662
gamepad_module_globals_table);

shared-bindings/gamepad/__init__.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,8 @@
2828
#ifndef MICROPY_INCLUDED_SHARED_BINDINGS_GAMEPAD___INIT___H
2929
#define MICROPY_INCLUDED_SHARED_BINDINGS_GAMEPAD___INIT___H
3030

31-
digitalio_digitalinout_obj_t *pin_io(mp_obj_t obj);
31+
#include "shared-bindings/digitalio/DigitalInOut.h"
32+
33+
digitalio_digitalinout_obj_t *assert_digitalinout(mp_obj_t obj);
3234

3335
#endif // MICROPY_INCLUDED_SHARED_BINDINGS_GAMEPAD___INIT___H

shared-bindings/gamepad/GamePadShift.c renamed to shared-bindings/gamepadshift/GamePadShift.c

Lines changed: 15 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -28,16 +28,16 @@
2828
#include "py/mphal.h"
2929
#include "py/gc.h"
3030
#include "py/mpstate.h"
31-
#include "shared-module/gamepad/__init__.h"
32-
#include "shared-module/gamepad/GamePadShift.h"
31+
#include "shared-bindings/gamepad/__init__.h"
32+
#include "shared-bindings/gamepadshift/GamePadShift.h"
33+
#include "shared-bindings/gamepadshift/__init__.h"
34+
#include "shared-module/gamepadshift/GamePadShift.h"
3335
#include "supervisor/shared/translate.h"
34-
#include "GamePadShift.h"
35-
#include "__init__.h"
3636

37-
//| .. currentmodule:: gamepad
37+
//| .. currentmodule:: gamepadshift
3838
//|
39-
//| :class:`GamePadShift` -- Scan buttons for presses
40-
//| =================================================
39+
//| :class:`GamePadShift` -- Scan buttons for presses through a shift register
40+
//| ===========================================================================
4141
//|
4242
//| .. class:: GamePadShift(data, clock, latch)
4343
//|
@@ -50,6 +50,9 @@
5050
//| is called, at which point the button state is cleared, and the new
5151
//| button presses start to be recorded.
5252
//|
53+
//| Only one gamepad (`gamepad.GamePad` or `gamepadshift.GamePadShift`)
54+
//| may be used at a time.
55+
//|
5356
STATIC mp_obj_t gamepadshift_make_new(const mp_obj_type_t *type, size_t n_args,
5457
const mp_obj_t *pos_args, mp_map_t *kw_args) {
5558

@@ -63,9 +66,9 @@ STATIC mp_obj_t gamepadshift_make_new(const mp_obj_type_t *type, size_t n_args,
6366
mp_arg_parse_all(n_args, pos_args, kw_args, MP_ARRAY_SIZE(allowed_args),
6467
allowed_args, args);
6568

66-
digitalio_digitalinout_obj_t *data_pin = pin_io(args[ARG_data].u_obj);
67-
digitalio_digitalinout_obj_t *clock_pin = pin_io(args[ARG_clock].u_obj);
68-
digitalio_digitalinout_obj_t *latch_pin = pin_io(args[ARG_latch].u_obj);
69+
digitalio_digitalinout_obj_t *data_pin = assert_digitalinout(args[ARG_data].u_obj);
70+
digitalio_digitalinout_obj_t *clock_pin = assert_digitalinout(args[ARG_clock].u_obj);
71+
digitalio_digitalinout_obj_t *latch_pin = assert_digitalinout(args[ARG_latch].u_obj);
6972

7073
gamepadshift_obj_t* gamepad_singleton = MP_STATE_VM(gamepad_singleton);
7174
if (!gamepad_singleton ||
@@ -76,7 +79,7 @@ STATIC mp_obj_t gamepadshift_make_new(const mp_obj_type_t *type, size_t n_args,
7679
gamepad_singleton = gc_make_long_lived(gamepad_singleton);
7780
MP_STATE_VM(gamepad_singleton) = gamepad_singleton;
7881
}
79-
gamepadshift_init(gamepad_singleton, data_pin, clock_pin, latch_pin);
82+
common_hal_gamepadshift_gamepadshift_init(gamepad_singleton, data_pin, clock_pin, latch_pin);
8083
return MP_OBJ_FROM_PTR(gamepad_singleton);
8184
}
8285

@@ -103,7 +106,7 @@ MP_DEFINE_CONST_FUN_OBJ_1(gamepadshift_get_pressed_obj, gamepadshift_get_pressed
103106
//| Disable button scanning.
104107
//|
105108
STATIC mp_obj_t gamepadshift_deinit(mp_obj_t self_in) {
106-
gamepad_reset();
109+
common_hal_gamepadshift_gamepadshift_deinit(self_in);
107110
return mp_const_none;
108111
}
109112
MP_DEFINE_CONST_FUN_OBJ_1(gamepadshift_deinit_obj, gamepadshift_deinit);

shared-module/gamepad/GamePadShift.c renamed to shared-bindings/gamepadshift/GamePadShift.h

Lines changed: 14 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -24,20 +24,19 @@
2424
* THE SOFTWARE.
2525
*/
2626

27-
#include "shared-bindings/digitalio/DigitalInOut.h"
28-
#include "GamePadShift.h"
2927

28+
#ifndef MICROPY_INCLUDED_SHARED_BINDINGS_GAMEPADSHIFT_GAMEPADSHIFT_H
29+
#define MICROPY_INCLUDED_SHARED_BINDINGS_GAMEPADSHIFT_GAMEPADSHIFT_H
3030

31-
void gamepadshift_init(gamepadshift_obj_t *gamepadshift,
32-
digitalio_digitalinout_obj_t *data_pin,
33-
digitalio_digitalinout_obj_t *clock_pin,
34-
digitalio_digitalinout_obj_t *latch_pin) {
35-
common_hal_digitalio_digitalinout_switch_to_input(data_pin, PULL_NONE);
36-
gamepadshift->data_pin = data_pin;
37-
common_hal_digitalio_digitalinout_switch_to_output(clock_pin, 0,
38-
DRIVE_MODE_PUSH_PULL);
39-
gamepadshift->clock_pin = clock_pin;
40-
common_hal_digitalio_digitalinout_switch_to_output(latch_pin, 1,
41-
DRIVE_MODE_PUSH_PULL);
42-
gamepadshift->latch_pin = latch_pin;
43-
}
31+
#include "shared-module/gamepadshift/GamePadShift.h"
32+
33+
extern const mp_obj_type_t gamepadshift_type;
34+
35+
void common_hal_gamepadshift_gamepadshift_init(gamepadshift_obj_t *gamepadshift,
36+
digitalio_digitalinout_obj_t *data_pin,
37+
digitalio_digitalinout_obj_t *clock_pin,
38+
digitalio_digitalinout_obj_t *latch_pin);
39+
40+
void common_hal_gamepadshift_gamepadshift_deinit(gamepadshift_obj_t *gamepadshift);
41+
42+
#endif // MICROPY_INCLUDED_SHARED_BINDINGS_GAMEPADSHIFT_GAMEPADSHIFT_H

0 commit comments

Comments
 (0)