Generalized adaptation of the WiiChuk_compat library.

Fork of WiiChuk_compat by Greg Brush

Committer:
d34d
Date:
Sat Dec 20 01:22:58 2014 +0000
Revision:
2:9c4ac1a64c30
Parent:
1:a5dbc8a15c83
Child:
3:fcc2f24d0644
More cleaning up of the original code.

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 2:9c4ac1a64c30 5 WiiChuck::WiiChuck(PinName data, PinName clk):_i2c(data, clk), _callback(NULL) {
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
d34d 1:a5dbc8a15c83 22 bool WiiChuck::read(nunchuck_data_t* data) {
d34d 1:a5dbc8a15c83 23
d34d 1:a5dbc8a15c83 24 //int i;
d34d 1:a5dbc8a15c83 25 char readBuf[NUNCHUCK_READLEN];
d34d 1:a5dbc8a15c83 26
d34d 1:a5dbc8a15c83 27 if (Error) {
d34d 1:a5dbc8a15c83 28 return false;
d34d 1:a5dbc8a15c83 29 }
d34d 1:a5dbc8a15c83 30
d34d 1:a5dbc8a15c83 31 const unsigned char cmd[] = {0x00};
d34d 1:a5dbc8a15c83 32 if (_i2c.write(NUNCHUCK_ADDR, (const char*)cmd, sizeof(cmd)) == I2C_ACK) {
d34d 1:a5dbc8a15c83 33 wait(I2C_READ_DELAY);
d34d 1:a5dbc8a15c83 34 if (_i2c.read(NUNCHUCK_ADDR, readBuf, sizeof(readBuf)) == I2C_ACK) {
d34d 2:9c4ac1a64c30 35 data->joyX = readBuf[JOY_X_IDX];
d34d 2:9c4ac1a64c30 36 data->joyY = readBuf[JOY_Y_IDX];
d34d 2:9c4ac1a64c30 37 data->accX = (uint16_t) readBuf[ACC_X_IDX] << 2 + ((readBuf[BUTTON_IDX] >> 2) & 0x03);
d34d 2:9c4ac1a64c30 38 data->accY = (uint16_t) readBuf[ACC_Y_IDX] << 2 + ((readBuf[BUTTON_IDX] >> 4) & 0x03);
d34d 2:9c4ac1a64c30 39 data->accZ = (uint16_t) readBuf[ACC_Z_IDX] << 2 + ((readBuf[BUTTON_IDX] >> 6) & 0x03);
d34d 1:a5dbc8a15c83 40
d34d 2:9c4ac1a64c30 41 data->buttonZ = !(readBuf[BUTTON_IDX] & 0x01);
d34d 2:9c4ac1a64c30 42 data->buttonC = !(readBuf[BUTTON_IDX] & 0x02);
d34d 1:a5dbc8a15c83 43 return true;
d34d 1:a5dbc8a15c83 44 }
d34d 1:a5dbc8a15c83 45 }
d34d 1:a5dbc8a15c83 46
d34d 1:a5dbc8a15c83 47 return false;
d34d 1:a5dbc8a15c83 48 }
d34d 1:a5dbc8a15c83 49
d34d 2:9c4ac1a64c30 50 void WiiChuck::attach(pt2Func function, float t) {
d34d 2:9c4ac1a64c30 51 _callback = function;
d34d 2:9c4ac1a64c30 52 _getValues.attach(this, &WiiChuck::getValues, t);
d34d 1:a5dbc8a15c83 53 }
d34d 2:9c4ac1a64c30 54 void WiiChuck::detach() {
d34d 1:a5dbc8a15c83 55 _getValues.detach();
d34d 2:9c4ac1a64c30 56 _callback = NULL;
d34d 1:a5dbc8a15c83 57 }
d34d 1:a5dbc8a15c83 58
d34d 2:9c4ac1a64c30 59 void WiiChuck::getValues() {
d34d 2:9c4ac1a64c30 60 bool hasData = read(&_data);
d34d 1:a5dbc8a15c83 61
d34d 2:9c4ac1a64c30 62 if(hasData) {
d34d 2:9c4ac1a64c30 63 _callback(&_data);
d34d 1:a5dbc8a15c83 64 }
d34d 1:a5dbc8a15c83 65 }