Generalized adaptation of the WiiChuk_compat library.

Fork of WiiChuk_compat by Greg Brush

Committer:
d34d
Date:
Fri Dec 19 18:10:44 2014 +0000
Revision:
1:a5dbc8a15c83
Child:
2:9c4ac1a64c30
Clean up this implementation so that it is more generic and can be used for just about any project where you need a Wii nunchuck.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
d34d 1:a5dbc8a15c83 1 #include "WiiChuck.h"
d34d 1:a5dbc8a15c83 2
d34d 1:a5dbc8a15c83 3
d34d 1:a5dbc8a15c83 4
d34d 1:a5dbc8a15c83 5 WiiChuck::WiiChuck(PinName data, PinName clk):_i2c(data, clk) {
d34d 1:a5dbc8a15c83 6 _i2c.frequency(400000); // should work at 100000 too
d34d 1:a5dbc8a15c83 7 Error = true;
d34d 1:a5dbc8a15c83 8
d34d 1:a5dbc8a15c83 9 // initialize Wii extension (nunchuk) based on "new way" initialization
d34d 1:a5dbc8a15c83 10 // http://wiibrew.org/wiki/Wiimote#The_New_Way
d34d 1:a5dbc8a15c83 11 // also disables need for decryption
d34d 1:a5dbc8a15c83 12
d34d 1:a5dbc8a15c83 13 unsigned char cmd[] = {0xF0, 0x55};
d34d 1:a5dbc8a15c83 14 if (_i2c.write(NUNCHUCK_ADDR, (const char*)cmd, sizeof(cmd)) == I2C_ACK) {
d34d 1:a5dbc8a15c83 15 Error = false;
d34d 1:a5dbc8a15c83 16 }
d34d 1:a5dbc8a15c83 17
d34d 1:a5dbc8a15c83 18 cmd[0] = 0xfb; cmd[1]= 0x00;
d34d 1:a5dbc8a15c83 19 _i2c.write(NUNCHUCK_ADDR, (const char*)cmd, sizeof(cmd));
d34d 1:a5dbc8a15c83 20
d34d 1:a5dbc8a15c83 21 _oldC = 0;
d34d 1:a5dbc8a15c83 22 _oldZ = 0;
d34d 1:a5dbc8a15c83 23 }
d34d 1:a5dbc8a15c83 24
d34d 1:a5dbc8a15c83 25 bool WiiChuck::read(nunchuck_data_t* data) {
d34d 1:a5dbc8a15c83 26
d34d 1:a5dbc8a15c83 27 //int i;
d34d 1:a5dbc8a15c83 28 char readBuf[NUNCHUCK_READLEN];
d34d 1:a5dbc8a15c83 29
d34d 1:a5dbc8a15c83 30 if (Error) {
d34d 1:a5dbc8a15c83 31 return false;
d34d 1:a5dbc8a15c83 32 }
d34d 1:a5dbc8a15c83 33
d34d 1:a5dbc8a15c83 34 const unsigned char cmd[] = {0x00};
d34d 1:a5dbc8a15c83 35 if (_i2c.write(NUNCHUCK_ADDR, (const char*)cmd, sizeof(cmd)) == I2C_ACK) {
d34d 1:a5dbc8a15c83 36 wait(I2C_READ_DELAY);
d34d 1:a5dbc8a15c83 37 if (_i2c.read(NUNCHUCK_ADDR, readBuf, sizeof(readBuf)) == I2C_ACK) {
d34d 1:a5dbc8a15c83 38 data->joyX = readBuf[Joy_X];
d34d 1:a5dbc8a15c83 39 data->joyY = readBuf[Joy_Y];
d34d 1:a5dbc8a15c83 40 data->accX = (uint16_t) readBuf[Acc_X] << 2 + ((readBuf[Button] >> 2) & 0x03);
d34d 1:a5dbc8a15c83 41 data->accY = (uint16_t) readBuf[Acc_Y] << 2 + ((readBuf[Button] >> 4) & 0x03);
d34d 1:a5dbc8a15c83 42 data->accZ = (uint16_t) readBuf[Acc_Z] << 2 + ((readBuf[Button] >> 6) & 0x03);
d34d 1:a5dbc8a15c83 43
d34d 1:a5dbc8a15c83 44 data->buttonZ = !(readBuf[Button] & 0x01);
d34d 1:a5dbc8a15c83 45 data->buttonC = !(readBuf[Button] & 0x02);
d34d 1:a5dbc8a15c83 46 return true;
d34d 1:a5dbc8a15c83 47 }
d34d 1:a5dbc8a15c83 48 }
d34d 1:a5dbc8a15c83 49
d34d 1:a5dbc8a15c83 50 return false;
d34d 1:a5dbc8a15c83 51 }
d34d 1:a5dbc8a15c83 52
d34d 1:a5dbc8a15c83 53 void WiiChuck::start()
d34d 1:a5dbc8a15c83 54 {
d34d 1:a5dbc8a15c83 55 _getValues.attach(this, &WiiChuck::getValues,0.2);
d34d 1:a5dbc8a15c83 56 }
d34d 1:a5dbc8a15c83 57 void WiiChuck::stop()
d34d 1:a5dbc8a15c83 58 {
d34d 1:a5dbc8a15c83 59 _getValues.detach();
d34d 1:a5dbc8a15c83 60 }
d34d 1:a5dbc8a15c83 61
d34d 1:a5dbc8a15c83 62 void WiiChuck::getValues()
d34d 1:a5dbc8a15c83 63 {
d34d 1:a5dbc8a15c83 64 nunchuck_data_t data;
d34d 1:a5dbc8a15c83 65
d34d 1:a5dbc8a15c83 66 bool hasData = read(&data);
d34d 1:a5dbc8a15c83 67
d34d 1:a5dbc8a15c83 68 if(hasData)
d34d 1:a5dbc8a15c83 69 {
d34d 1:a5dbc8a15c83 70 //analyse
d34d 1:a5dbc8a15c83 71 if(!_oldC && data.buttonC)
d34d 1:a5dbc8a15c83 72 {
d34d 1:a5dbc8a15c83 73 _oldC = true;
d34d 1:a5dbc8a15c83 74 _callback_input(BUTTON_CANCEL_VALUE);
d34d 1:a5dbc8a15c83 75 return;
d34d 1:a5dbc8a15c83 76 }
d34d 1:a5dbc8a15c83 77 else
d34d 1:a5dbc8a15c83 78 {
d34d 1:a5dbc8a15c83 79 _oldC = data.buttonC;
d34d 1:a5dbc8a15c83 80 }
d34d 1:a5dbc8a15c83 81
d34d 1:a5dbc8a15c83 82 //analyse
d34d 1:a5dbc8a15c83 83 if(!_oldZ&& data.buttonZ)
d34d 1:a5dbc8a15c83 84 {
d34d 1:a5dbc8a15c83 85 _oldZ = true;
d34d 1:a5dbc8a15c83 86 _callback_input(BUTTON_OK_VALUE);
d34d 1:a5dbc8a15c83 87 return;
d34d 1:a5dbc8a15c83 88 }
d34d 1:a5dbc8a15c83 89 else
d34d 1:a5dbc8a15c83 90 {
d34d 1:a5dbc8a15c83 91 _oldZ = data.buttonZ;
d34d 1:a5dbc8a15c83 92 }
d34d 1:a5dbc8a15c83 93
d34d 1:a5dbc8a15c83 94 if(data.joyY>160)
d34d 1:a5dbc8a15c83 95 {
d34d 1:a5dbc8a15c83 96 _callback_input(BUTTON_VOLUME_PLUS);
d34d 1:a5dbc8a15c83 97 return;
d34d 1:a5dbc8a15c83 98 }
d34d 1:a5dbc8a15c83 99 if(data.joyY<80)
d34d 1:a5dbc8a15c83 100 {
d34d 1:a5dbc8a15c83 101
d34d 1:a5dbc8a15c83 102 _callback_input(BUTTON_VOLUME_MINUS);
d34d 1:a5dbc8a15c83 103 return;
d34d 1:a5dbc8a15c83 104 }
d34d 1:a5dbc8a15c83 105 if(data.joyX>160)
d34d 1:a5dbc8a15c83 106 {
d34d 1:a5dbc8a15c83 107 _callback_input(BUTTON_NEXT_VALUE);
d34d 1:a5dbc8a15c83 108 return;
d34d 1:a5dbc8a15c83 109 }
d34d 1:a5dbc8a15c83 110 if(data.joyX<80)
d34d 1:a5dbc8a15c83 111 {
d34d 1:a5dbc8a15c83 112
d34d 1:a5dbc8a15c83 113 _callback_input(BUTTON_PREV_VALUE);
d34d 1:a5dbc8a15c83 114 return;
d34d 1:a5dbc8a15c83 115 }
d34d 1:a5dbc8a15c83 116
d34d 1:a5dbc8a15c83 117 }
d34d 1:a5dbc8a15c83 118 }
d34d 1:a5dbc8a15c83 119 void WiiChuck::attach(pt2Func function)
d34d 1:a5dbc8a15c83 120 {
d34d 1:a5dbc8a15c83 121 _callback_input = function;
d34d 1:a5dbc8a15c83 122 }
d34d 1:a5dbc8a15c83 123
d34d 1:a5dbc8a15c83 124