Skip to content

Commit 6479cb0

Browse files
authored
Merge pull request #868 from pewpew-game/gamepad-longlive
Make the gamepad singleton long-living and add it to root pointers
2 parents 0950415 + d02899f commit 6479cb0

File tree

6 files changed

+16
-11
lines changed

6 files changed

+16
-11
lines changed

ports/atmel-samd/mpconfigport.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -312,6 +312,7 @@ extern const struct _mp_obj_module_t usb_hid_module;
312312
mp_obj_t playing_audio[AUDIO_DMA_CHANNEL_COUNT]; \
313313
mp_obj_t rtc_time_source; \
314314
FLASH_ROOT_POINTERS \
315+
mp_obj_t gamepad_singleton; \
315316

316317
void run_background_tasks(void);
317318
#define MICROPY_VM_HOOK_LOOP run_background_tasks();

ports/nrf/mpconfigport.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -323,6 +323,7 @@ extern const struct _mp_obj_module_t ble_module;
323323
struct _music_data_t *music_data; \
324324
const struct _pwm_events *pwm_active_events; \
325325
const struct _pwm_events *pwm_pending_events; \
326+
mp_obj_t gamepad_singleton; \
326327

327328
#define MP_PLAT_PRINT_STRN(str, len) mp_hal_stdout_tx_strn_cooked(str, len)
328329

shared-bindings/gamepad/GamePad.c

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -26,14 +26,15 @@
2626
#include "py/obj.h"
2727
#include "py/runtime.h"
2828
#include "py/mphal.h"
29+
#include "py/gc.h"
30+
#include "py/mpstate.h"
31+
#include "shared-module/gamepad/__init__.h"
2932
#include "shared-module/gamepad/GamePad.h"
3033
#include "shared-bindings/digitalio/DigitalInOut.h"
3134
#include "shared-bindings/util.h"
3235
#include "GamePad.h"
3336

3437

35-
gamepad_obj_t* gamepad_singleton = NULL;
36-
3738
//| .. currentmodule:: gamepad
3839
//|
3940
//| :class:`GamePad` -- Scan buttons for presses
@@ -105,12 +106,13 @@ STATIC mp_obj_t gamepad_make_new(const mp_obj_type_t *type, size_t n_args,
105106
raise_error_if_deinited(
106107
common_hal_digitalio_digitalinout_deinited(pin));
107108
}
108-
if (!gamepad_singleton) {
109-
gamepad_singleton = m_new_obj(gamepad_obj_t);
109+
if (!MP_STATE_VM(gamepad_singleton)) {
110+
gamepad_obj_t* gamepad_singleton = m_new_obj(gamepad_obj_t);
110111
gamepad_singleton->base.type = &gamepad_type;
112+
MP_STATE_VM(gamepad_singleton) = gc_make_long_lived(gamepad_singleton);
111113
}
112114
gamepad_init(n_args, args);
113-
return MP_OBJ_FROM_PTR(gamepad_singleton);
115+
return MP_OBJ_FROM_PTR(MP_STATE_VM(gamepad_singleton));
114116
}
115117

116118

@@ -125,6 +127,7 @@ STATIC mp_obj_t gamepad_make_new(const mp_obj_type_t *type, size_t n_args,
125127
//| held down) can be recorded for the next call.
126128
//|
127129
STATIC mp_obj_t gamepad_get_pressed(mp_obj_t self_in) {
130+
gamepad_obj_t* gamepad_singleton = MP_STATE_VM(gamepad_singleton);
128131
mp_obj_t gamepad = MP_OBJ_NEW_SMALL_INT(gamepad_singleton->pressed);
129132
gamepad_singleton->pressed = 0;
130133
return gamepad;
@@ -137,14 +140,12 @@ MP_DEFINE_CONST_FUN_OBJ_1(gamepad_get_pressed_obj, gamepad_get_pressed);
137140
//| Disable button scanning.
138141
//|
139142
STATIC mp_obj_t gamepad_deinit(mp_obj_t self_in) {
140-
gamepad_singleton = NULL;
143+
gamepad_reset();
141144
return mp_const_none;
142145
}
143146
MP_DEFINE_CONST_FUN_OBJ_1(gamepad_deinit_obj, gamepad_deinit);
144147

145148

146-
STATIC mp_obj_t gamepad_make_new(const mp_obj_type_t *type, size_t n_args,
147-
size_t n_kw, const mp_obj_t *args);
148149
STATIC const mp_rom_map_elem_t gamepad_locals_dict_table[] = {
149150
{ MP_OBJ_NEW_QSTR(MP_QSTR_get_pressed), MP_ROM_PTR(&gamepad_get_pressed_obj)},
150151
{ MP_OBJ_NEW_QSTR(MP_QSTR_deinit), MP_ROM_PTR(&gamepad_deinit_obj)},

shared-module/gamepad/GamePad.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626

2727
#include <stdbool.h>
2828

29+
#include "py/mpstate.h"
2930
#include "__init__.h"
3031
#include "GamePad.h"
3132

@@ -35,6 +36,7 @@
3536

3637

3738
void gamepad_init(size_t n_pins, const mp_obj_t* pins) {
39+
gamepad_obj_t* gamepad_singleton = MP_STATE_VM(gamepad_singleton);
3840
for (size_t i = 0; i < 8; ++i) {
3941
gamepad_singleton->pins[i] = NULL;
4042
}

shared-module/gamepad/GamePad.h

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,8 +39,6 @@ typedef struct {
3939
uint8_t pulls;
4040
} gamepad_obj_t;
4141

42-
extern gamepad_obj_t* gamepad_singleton;
43-
4442
void gamepad_init(size_t n_pins, const mp_obj_t* pins);
4543

4644
#endif // MICROPY_INCLUDED_GAMEPAD_GAMEPAD_H

shared-module/gamepad/__init__.c

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,13 +26,15 @@
2626

2727
#include <stdbool.h>
2828

29+
#include "py/mpstate.h"
2930
#include "__init__.h"
3031
#include "GamePad.h"
3132

3233
#include "shared-bindings/digitalio/DigitalInOut.h"
3334

3435

3536
void gamepad_tick(void) {
37+
gamepad_obj_t* gamepad_singleton = MP_STATE_VM(gamepad_singleton);
3638
if (!gamepad_singleton) {
3739
return;
3840
}
@@ -54,5 +56,5 @@ void gamepad_tick(void) {
5456
}
5557

5658
void gamepad_reset(void) {
57-
gamepad_singleton = NULL;
59+
MP_STATE_VM(gamepad_singleton) = NULL;
5860
}

0 commit comments

Comments
 (0)