Generalized adaptation of the WiiChuk_compat library.

Fork of WiiChuk_compat by Greg Brush

Revision:
1:a5dbc8a15c83
Child:
2:9c4ac1a64c30
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/WiiChuck.cpp	Fri Dec 19 18:10:44 2014 +0000
@@ -0,0 +1,124 @@
+#include "WiiChuck.h"
+
+
+
+WiiChuck::WiiChuck(PinName data, PinName clk):_i2c(data, clk) {
+    _i2c.frequency(400000); // should work at 100000 too
+    Error = true;
+
+    // initialize Wii extension (nunchuk) based on "new way" initialization
+    // http://wiibrew.org/wiki/Wiimote#The_New_Way
+    // also disables need for decryption
+    
+    unsigned char cmd[] = {0xF0, 0x55};
+    if (_i2c.write(NUNCHUCK_ADDR, (const char*)cmd, sizeof(cmd)) == I2C_ACK) {
+        Error = false;
+    }
+    
+    cmd[0] = 0xfb; cmd[1]= 0x00;
+    _i2c.write(NUNCHUCK_ADDR, (const char*)cmd, sizeof(cmd));
+    
+    _oldC = 0;
+    _oldZ = 0;
+}
+
+bool WiiChuck::read(nunchuck_data_t* data) {
+
+    //int i;
+    char readBuf[NUNCHUCK_READLEN];
+    
+    if (Error) {
+        return false;
+    }
+    
+    const unsigned char cmd[] = {0x00};
+    if (_i2c.write(NUNCHUCK_ADDR, (const char*)cmd, sizeof(cmd)) == I2C_ACK) {
+        wait(I2C_READ_DELAY);
+        if (_i2c.read(NUNCHUCK_ADDR, readBuf, sizeof(readBuf)) == I2C_ACK) {      
+            data->joyX = readBuf[Joy_X];
+            data->joyY = readBuf[Joy_Y];
+            data->accX = (uint16_t) readBuf[Acc_X] << 2 + ((readBuf[Button] >> 2) & 0x03);
+            data->accY = (uint16_t) readBuf[Acc_Y] << 2 + ((readBuf[Button] >> 4) & 0x03);
+            data->accZ = (uint16_t) readBuf[Acc_Z] << 2 + ((readBuf[Button] >> 6) & 0x03);
+
+            data->buttonZ = !(readBuf[Button] & 0x01);
+            data->buttonC = !(readBuf[Button] & 0x02);
+            return true;
+        }
+    }
+
+    return false;
+}
+
+void WiiChuck::start()
+{
+    _getValues.attach(this, &WiiChuck::getValues,0.2);
+}
+void WiiChuck::stop()
+{
+     _getValues.detach();
+}
+
+void WiiChuck::getValues()
+{
+    nunchuck_data_t data;
+    
+    bool hasData = read(&data);
+  
+    if(hasData)
+    {
+        //analyse
+        if(!_oldC && data.buttonC)
+        {
+            _oldC = true;
+            _callback_input(BUTTON_CANCEL_VALUE);
+            return;
+        }
+        else
+        {
+            _oldC = data.buttonC;
+        }
+        
+        //analyse
+        if(!_oldZ&& data.buttonZ)
+        {
+            _oldZ = true;
+            _callback_input(BUTTON_OK_VALUE);
+            return;
+        }
+        else
+        {
+            _oldZ = data.buttonZ;
+        }
+        
+        if(data.joyY>160)
+        {
+            _callback_input(BUTTON_VOLUME_PLUS);
+            return;
+        }
+        if(data.joyY<80)
+        {
+        
+            _callback_input(BUTTON_VOLUME_MINUS);
+            return;
+        }
+        if(data.joyX>160)
+        {
+            _callback_input(BUTTON_NEXT_VALUE);
+            return;
+        }
+        if(data.joyX<80)
+        {
+        
+            _callback_input(BUTTON_PREV_VALUE);
+            return;
+        }
+        
+    }
+}
+void WiiChuck::attach(pt2Func function)
+{
+    _callback_input = function;
+}
+
+