1 /*
2  * Author: Jon Trulson <jtrulson@ics.com>
3  * Copyright (c) 2015 Intel Corporation.
4  *
5  * Permission is hereby granted, free of charge, to any person obtaining
6  * a copy of this software and associated documentation files (the
7  * "Software"), to deal in the Software without restriction, including
8  * without limitation the rights to use, copy, modify, merge, publish,
9  * distribute, sublicense, and/or sell copies of the Software, and to
10  * permit persons to whom the Software is furnished to do so, subject to
11  * the following conditions:
12  *
13  * The above copyright notice and this permission notice shall be
14  * included in all copies or substantial portions of the Software.
15  *
16  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19  * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20  * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21  * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22  * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
23  */
24 #pragma once
25 
26 #include <string>
27 #include <mraa/i2c.h>
28 
29 #define NUNCHUCK_I2C_ADDR    0x52
30 
31 namespace upm {
32 
33   /**
34    * @brief Wii Nunchuk library
35    * @defgroup nunchuck libupm-nunchuck
36    * @ingroup generic i2c accelerometer robok
37    */
38   /**
39    * @library nunchuck
40    * @sensor nunchuck
41    * @comname Wii Nunchuk
42    * @type accelerometer
43    * @man generic
44    * @web http://wiibrew.org/wiki/Wiimote/Extension_Controllers
45    * @con i2c
46    * @kit robok
47    *
48    * @brief API for the Wii* Nunchuk controller
49    *
50    * UPM module for the Wii Nunchuk controller. This module was tested with
51    * Wii Nunchuk connected to I2C via a Grove Wii Nunchuk adapter.
52    *
53    * See http://wiibrew.org/wiki/Wiimote/Extension_Controllers and
54    * http://wiibrew.org/wiki/Wiimote/Extension_Controllers/Nunchuck
55    * for more details on the controller and its protocol.
56    *
57    * A warning for the Grove Wii Nunchuk adapter: it has 2 traces on one
58    * side, and 3 traces on the other.  Do not match these up with the
59    * Nunchuk connector's traces. The connector's 'Grove'
60    * should be on the same side as the Grove interface socket on the
61    * adapter.
62    *
63    * @image html nunchuck.jpg
64    * @snippet nunchuck.cxx Interesting
65    */
66   class NUNCHUCK {
67   public:
68     /**
69      * NUNCHUCK constructor
70      *
71      * @param bus I2C bus to use
72      * @param addr I2C address to use
73      */
74     NUNCHUCK(int bus, uint8_t addr=NUNCHUCK_I2C_ADDR);
75 
76     /**
77      * NUNCHUCK destructor
78      */
79     ~NUNCHUCK();
80 
81     /**
82      * Writes value(s) into registers
83      *
84      * @param reg Register location to start writing into
85      * @param byte Byte to write
86      * @return True if successful
87      */
88     bool writeByte(uint8_t reg, uint8_t byte);
89 
90     /**
91      * Reads value(s) from registers
92      *
93      * @param reg Register location to start reading from
94      * @param buffer Buffer for data storage
95      * @param len Number of bytes to read
96      * @return Number of bytes read
97      */
98     int readBytes(uint8_t reg, uint8_t *buffer, int len);
99 
100     /**
101      * Initializes the controller. Here, we disable encryption after
102      * delaying for a time to ensure the controller is ready.
103      *
104      * @return True if initialization is successful
105      */
106     bool init();
107 
108     /**
109      * Reads and updates the current state of the controller.
110      *
111      */
112     void update();
113 
114     /**
115      * Current analog stick X position
116      *
117      */
118     int stickX;
119 
120     /**
121      * Current analog stick Y position
122      *
123      */
124     int stickY;
125 
126     /**
127      * Current accelerometer X value
128      *
129      */
130     int accelX;
131 
132     /**
133      * Current accelerometer Y value
134      *
135      */
136     int accelY;
137 
138     /**
139      * Current accelerometer Z value
140      *
141      */
142     int accelZ;
143 
144     /**
145      * Button C pressed?
146      *
147      */
148     bool buttonC;
149 
150     /**
151      * Button Z pressed?
152      *
153      */
154     bool buttonZ;
155 
156   private:
157     mraa_i2c_context m_i2c;
158   };
159 }
160 
161 
162