@@ -49,10 +49,16 @@ class Nunchuk:
49
49
:type i2c_read_delay: float, optional
50
50
"""
51
51
52
- def __init__ (self , i2c , address = 0x52 , i2c_read_delay = 0.002 ):
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
+
57
+ def __init__ (self , i2c , address = 0x52 , i2c_read_delay = 0.002 , force_read = True ):
53
58
self .buffer = bytearray (8 )
54
59
self .i2c_device = I2CDevice (i2c , address )
55
60
self ._i2c_read_delay = i2c_read_delay
61
+ self ._force_read = force_read
56
62
time .sleep (_I2C_INIT_DELAY )
57
63
with self .i2c_device as i2c_dev :
58
64
# turn off encrypted data
@@ -65,33 +71,44 @@ def __init__(self, i2c, address=0x52, i2c_read_delay=0.002):
65
71
def values (self ):
66
72
"""Return named tuple of all the input values."""
67
73
self .read_data ()
68
- (sx , sy ), bc , bz , (ax , ay , az ) = ( # pylint: disable=invalid-name
69
- self .joystick ,
70
- self .button_C ,
71
- self .button_Z ,
72
- self .acceleration ,
74
+ temp_force_read = self ._force_read
75
+ self ._force_read = False
76
+ values = self ._Values (
77
+ self ._Joystick (self .joystick [0 ], self .joystick [1 ]),
78
+ self ._Buttons (self .button_C , self .button_Z ),
79
+ self ._Acceleration (
80
+ self .acceleration [0 ], self .acceleration [1 ], self .acceleration [2 ]
81
+ ),
73
82
)
74
- Values = namedtuple ( "Values" , "sx sy bc bz ax ay az" )
75
- return Values ( sx , sy , bc , bz , ax , ay , az )
83
+ self . _force_read = temp_force_read
84
+ return values
76
85
77
86
@property
78
87
def joystick (self ):
79
88
"""Return tuple of current joystick position."""
89
+ if self ._force_read :
90
+ self .read_data ()
80
91
return self .buffer [0 ], self .buffer [1 ]
81
92
82
93
@property
83
94
def button_C (self ): # pylint: disable=invalid-name
84
95
"""Return current pressed state of button C."""
96
+ if self ._force_read :
97
+ self .read_data ()
85
98
return not bool (self .buffer [5 ] & 0x02 )
86
99
87
100
@property
88
101
def button_Z (self ): # pylint: disable=invalid-name
89
102
"""Return current pressed state of button Z."""
103
+ if self ._force_read :
104
+ self .read_data ()
90
105
return not bool (self .buffer [5 ] & 0x01 )
91
106
92
107
@property
93
108
def acceleration (self ):
94
109
"""Return 3 tuple of accelerometer reading."""
110
+ if self ._force_read :
111
+ self .read_data ()
95
112
x = (self .buffer [5 ] & 0xC0 ) >> 6
96
113
x |= self .buffer [2 ] << 2
97
114
y = (self .buffer [5 ] & 0x30 ) >> 4
0 commit comments