31
31
import adafruit_thermistor
32
32
import neopixel
33
33
import touchio
34
- import gamepad
34
+ import keypad
35
35
36
36
37
37
__version__ = "0.0.0-auto.0"
38
38
__repo__ = "https://github.com/adafruit/Adafruit_CircuitPython_CircuitPlayground.git"
39
39
40
40
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
+
41
84
class Photocell :
42
85
"""Simple driver for analog photocell on the Circuit Playground Express and Bluefruit."""
43
86
@@ -58,11 +101,9 @@ class CircuitPlaygroundBase: # pylint: disable=too-many-public-methods
58
101
_audio_out = None
59
102
60
103
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 )
66
107
67
108
# Define switch:
68
109
self ._switch = digitalio .DigitalInOut (board .SLIDE_SWITCH )
@@ -569,7 +610,8 @@ def button_a(self):
569
610
if cp.button_a:
570
611
print("Button A pressed!")
571
612
"""
572
- return self ._a .value
613
+ self ._states .update ()
614
+ return self ._states .pressed (0 )
573
615
574
616
@property
575
617
def button_b (self ):
@@ -588,7 +630,8 @@ def button_b(self):
588
630
if cp.button_b:
589
631
print("Button B pressed!")
590
632
"""
591
- return self ._b .value
633
+ self ._states .update ()
634
+ return self ._states .pressed (1 )
592
635
593
636
@property
594
637
def were_pressed (self ):
@@ -606,12 +649,8 @@ def were_pressed(self):
606
649
while True:
607
650
print(cp.were_pressed)
608
651
"""
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 )}
615
654
616
655
@property
617
656
def switch (self ):
0 commit comments