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//|
127129STATIC 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//|
139142STATIC mp_obj_t gamepad_deinit (mp_obj_t self_in ) {
140- gamepad_singleton = NULL ;
143+ gamepad_reset () ;
141144 return mp_const_none ;
142145}
143146MP_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 );
148149STATIC 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 )},
0 commit comments