Skip to content

Commit 19258ca

Browse files
authored
Merge pull request #24 from jfurcean/add-values-property
add values property and refactor other properties
2 parents b653d73 + faba124 commit 19258ca

File tree

6 files changed

+54
-50
lines changed

6 files changed

+54
-50
lines changed

adafruit_nunchuk.py

Lines changed: 42 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
* Adafruit's Bus Device library: https://github.com/adafruit/Adafruit_CircuitPython_BusDevice
2727
"""
2828
import time
29+
from collections import namedtuple
2930
from adafruit_bus_device.i2c_device import I2CDevice
3031

3132
__version__ = "0.0.0-auto.0"
@@ -48,6 +49,11 @@ class Nunchuk:
4849
:type i2c_read_delay: float, optional
4950
"""
5051

52+
_Values = namedtuple("Values", ("joystick", "buttons", "acceleration"))
53+
_Joystick = namedtuple("Joystick", ("x", "y"))
54+
_Buttons = namedtuple("Buttons", ("C", "Z"))
55+
_Acceleration = namedtuple("Acceleration", ("x", "y", "z"))
56+
5157
def __init__(self, i2c, address=0x52, i2c_read_delay=0.002):
5258
self.buffer = bytearray(8)
5359
self.i2c_device = I2CDevice(i2c, address)
@@ -61,32 +67,50 @@ def __init__(self, i2c, address=0x52, i2c_read_delay=0.002):
6167
i2c_dev.write(b"\xFB\x00")
6268

6369
@property
64-
def joystick(self):
65-
"""Return tuple of current joystick position."""
70+
def values(self):
71+
"""The current state of all values."""
6672
self._read_data()
67-
return self.buffer[0], self.buffer[1]
73+
return self._Values(
74+
self._joystick(do_read=False),
75+
self._buttons(do_read=False),
76+
self._acceleration(do_read=False),
77+
)
6878

6979
@property
70-
def button_C(self): # pylint: disable=invalid-name
71-
"""Return current pressed state of button C."""
72-
return not bool(self._read_data()[5] & 0x02)
80+
def joystick(self):
81+
"""The current joystick position."""
82+
return self._joystick()
7383

7484
@property
75-
def button_Z(self): # pylint: disable=invalid-name
76-
"""Return current pressed state of button Z."""
77-
return not bool(self._read_data()[5] & 0x01)
85+
def buttons(self): # pylint: disable=invalid-name
86+
"""The current pressed state of button Z."""
87+
return self._buttons()
7888

7989
@property
8090
def acceleration(self):
81-
"""Return 3 tuple of accelerometer reading."""
82-
self._read_data()
83-
x = (self.buffer[5] & 0xC0) >> 6
84-
x |= self.buffer[2] << 2
85-
y = (self.buffer[5] & 0x30) >> 4
86-
y |= self.buffer[3] << 2
87-
z = (self.buffer[5] & 0x0C) >> 2
88-
z |= self.buffer[4] << 2
89-
return x, y, z
91+
"""The current accelerometer reading."""
92+
return self._acceleration()
93+
94+
def _joystick(self, do_read=True):
95+
if do_read:
96+
self._read_data()
97+
return self._Joystick(self.buffer[0], self.buffer[1]) # x, y
98+
99+
def _buttons(self, do_read=True):
100+
if do_read:
101+
self._read_data()
102+
return self._Buttons(
103+
not bool(self.buffer[5] & 0x02), not bool(self.buffer[5] & 0x01) # C # Z
104+
)
105+
106+
def _acceleration(self, do_read=True):
107+
if do_read:
108+
self._read_data()
109+
return self._Acceleration(
110+
((self.buffer[5] & 0xC0) >> 6) | (self.buffer[2] << 2), # ax
111+
((self.buffer[5] & 0x30) >> 4) | (self.buffer[3] << 2), # ay
112+
((self.buffer[5] & 0x0C) >> 2) | (self.buffer[4] << 2), # az
113+
)
90114

91115
def _read_data(self):
92116
return self._read_register(b"\x00")

docs/conf.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@
2525
# Uncomment the below if you use native CircuitPython modules such as
2626
# digitalio, micropython and busio. List the modules you use. Without it, the
2727
# autodoc module docs will fail to generate with a warning.
28-
# autodoc_mock_imports = ["digitalio", "busio"]
28+
autodoc_mock_imports = ["adafruit_bus_device"]
2929

3030

3131
intersphinx_mapping = {

examples/nunchuk_accel_mouse.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
# print((0 if nc.button_C else 1, 0 if nc.button_Z else 1))
2828

2929
while True:
30+
3031
accel = nc.acceleration
3132
# print(accel)
3233
# x, y = nc.joystick
@@ -41,9 +42,10 @@
4142
relY = y - centerY
4243

4344
m.move(int(scaleX * relX), int(scaleY * relY), 0)
45+
buttons = nc.buttons
4446

45-
c = nc.button_C
46-
z = nc.button_Z
47+
c = buttons.C
48+
z = buttons.Z
4749

4850
if z and not zDown:
4951
stillDown = True

examples/nunchuk_analog_mouse.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
# print((0 if nc.button_C else 1, 0 if nc.button_Z else 1))
2828

2929
while True:
30+
3031
x, y = nc.joystick
3132
# Eliminate spurious reads
3233
if x == 255 or y == 255:
@@ -36,8 +37,9 @@
3637

3738
m.move(int(scaleX * relX), int(scaleY * relY), 0)
3839

39-
c = nc.button_C
40-
z = nc.button_Z
40+
buttons = nc.buttons
41+
c = buttons.C
42+
z = buttons.Z
4143

4244
if z and not zDown:
4345
stillDown = True

examples/nunchuk_mouse.py

Lines changed: 0 additions & 25 deletions
This file was deleted.

examples/nunchuk_simpletest.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,9 @@
1212
ax, ay, az = nc.acceleration
1313
print("joystick = {},{}".format(x, y))
1414
print("accceleration ax={}, ay={}, az={}".format(ax, ay, az))
15-
if nc.button_C:
15+
16+
if nc.buttons.C:
1617
print("button C")
17-
if nc.button_Z:
18+
if nc.buttons.Z:
1819
print("button Z")
1920
time.sleep(0.5)

0 commit comments

Comments
 (0)