Skip to content

Commit 68b7e58

Browse files
authored
Merge pull request #106 from kattni/keypad-gamepad
Remove gamepad, utilise keypad.
2 parents 63ac92f + adcd972 commit 68b7e58

File tree

3 files changed

+69
-14
lines changed

3 files changed

+69
-14
lines changed

adafruit_circuitplayground/circuit_playground_base.py

Lines changed: 53 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -31,13 +31,56 @@
3131
import adafruit_thermistor
3232
import neopixel
3333
import 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+
4184
class 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):

docs/conf.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
import sys
99

1010
sys.path.insert(0, os.path.abspath(".."))
11+
sys.path.insert(0, os.path.abspath("mocks"))
1112

1213
# -- General configuration ------------------------------------------------
1314

docs/mocks/keypad.py

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
# SPDX-FileCopyrightText: 2021 Jeff Eplerfor Adafruit Industries
2+
#
3+
# SPDX-License-Identifier: MIT
4+
class EventQueue:
5+
def __init__(self):
6+
self.overflowed = False
7+
8+
def get(self):
9+
return None
10+
11+
12+
class Keys:
13+
def __init__(self, pins, value_when_pressed, pull):
14+
self.key_count = len(pins)
15+
self.events = EventQueue()

0 commit comments

Comments
 (0)