3131import adafruit_thermistor
3232import neopixel
3333import touchio
34- import gamepad
34+ import keypad
3535
3636
3737__version__ = "0.0.0-auto.0"
3838__repo__ = "https://github.com/adafruit/Adafruit_CircuitPython_CircuitPlayground.git"
3939
4040
41+ class KeyStates :
42+ """Convert `keypad.Event` information from the given `keypad` scanner into key-pressed state.
43+
44+ :param scanner: a `keypad` scanner, such as `keypad.Keys`
45+ """
46+
47+ def __init__ (self , scanner ):
48+ self ._scanner = scanner
49+ self ._pressed = [False ] * self ._scanner .key_count
50+ self .update ()
51+
52+ def update (self ):
53+ """Update key information based on pending scanner events."""
54+
55+ # If the event queue overflowed, discard any pending events,
56+ # and assume all keys are now released.
57+ if self ._scanner .events .overflowed :
58+ self ._scanner .events .clear ()
59+ self ._scanner .reset ()
60+ self ._pressed = [False ] * self ._scanner .key_count
61+
62+ self ._was_pressed = self ._pressed .copy ()
63+
64+ while True :
65+ event = self ._scanner .events .get ()
66+ if not event :
67+ # Event queue is now empty.
68+ break
69+ self ._pressed [event .key_number ] = event .pressed
70+ if event .pressed :
71+ self ._was_pressed [event .key_number ] = True
72+
73+ def was_pressed (self , key_number ):
74+ """True if key was down at any time since the last `update()`,
75+ even if it was later released.
76+ """
77+ return self ._was_pressed [key_number ]
78+
79+ def pressed (self , key_number ):
80+ """True if key is currently pressed, as of the last `update()`."""
81+ return self ._pressed [key_number ]
82+
83+
4184class Photocell :
4285 """Simple driver for analog photocell on the Circuit Playground Express and Bluefruit."""
4386
@@ -58,11 +101,9 @@ class CircuitPlaygroundBase: # pylint: disable=too-many-public-methods
58101 _audio_out = None
59102
60103 def __init__ (self ):
61- self ._a = digitalio .DigitalInOut (board .BUTTON_A )
62- self ._a .switch_to_input (pull = digitalio .Pull .DOWN )
63- self ._b = digitalio .DigitalInOut (board .BUTTON_B )
64- self ._b .switch_to_input (pull = digitalio .Pull .DOWN )
65- self .gamepad = gamepad .GamePad (self ._a , self ._b )
104+ self ._button_pins = [board .BUTTON_A , board .BUTTON_B ]
105+ self ._keys = keypad .Keys (self ._button_pins , value_when_pressed = True , pull = True )
106+ self ._states = KeyStates (self ._keys )
66107
67108 # Define switch:
68109 self ._switch = digitalio .DigitalInOut (board .SLIDE_SWITCH )
@@ -569,7 +610,8 @@ def button_a(self):
569610 if cp.button_a:
570611 print("Button A pressed!")
571612 """
572- return self ._a .value
613+ self ._states .update ()
614+ return self ._states .pressed (0 )
573615
574616 @property
575617 def button_b (self ):
@@ -588,7 +630,8 @@ def button_b(self):
588630 if cp.button_b:
589631 print("Button B pressed!")
590632 """
591- return self ._b .value
633+ self ._states .update ()
634+ return self ._states .pressed (1 )
592635
593636 @property
594637 def were_pressed (self ):
@@ -606,12 +649,8 @@ def were_pressed(self):
606649 while True:
607650 print(cp.were_pressed)
608651 """
609- ret = set ()
610- pressed = self .gamepad .get_pressed ()
611- for button , mask in (("A" , 0x01 ), ("B" , 0x02 )):
612- if mask & pressed :
613- ret .add (button )
614- return ret
652+ self ._states .update ()
653+ return {("A" , "B" )[i ] for i in range (2 ) if self ._states .was_pressed (i )}
615654
616655 @property
617656 def switch (self ):
0 commit comments