Generalized adaptation of the WiiChuk_compat library.

Fork of WiiChuk_compat by Greg Brush

Committer:
d34d
Date:
Mon Dec 22 03:32:51 2014 +0000
Revision:
5:be9ce129de7c
Parent:
3:fcc2f24d0644
Add method for calibrating joystick center position.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
d34d 1:a5dbc8a15c83 1 #include "WiiChuck.h"
d34d 1:a5dbc8a15c83 2
d34d 3:fcc2f24d0644 3 WiiChuck::WiiChuck(PinName data, PinName clk, uint32_t i2cFrequency):_i2c(data, clk),
d34d 3:fcc2f24d0644 4 _callback(NULL), _initialized(false) {
d34d 3:fcc2f24d0644 5 _i2c.frequency(i2cFrequency);
d34d 1:a5dbc8a15c83 6
d34d 1:a5dbc8a15c83 7 // initialize Wii extension (nunchuk) based on "new way" initialization
d34d 1:a5dbc8a15c83 8 // http://wiibrew.org/wiki/Wiimote#The_New_Way
d34d 1:a5dbc8a15c83 9 // also disables need for decryption
d34d 1:a5dbc8a15c83 10
d34d 3:fcc2f24d0644 11 char cmd[] = {0xF0, 0x55};
d34d 1:a5dbc8a15c83 12 if (_i2c.write(NUNCHUCK_ADDR, (const char*)cmd, sizeof(cmd)) == I2C_ACK) {
d34d 3:fcc2f24d0644 13 _initialized = true;
d34d 1:a5dbc8a15c83 14 }
d34d 1:a5dbc8a15c83 15
d34d 1:a5dbc8a15c83 16 cmd[0] = 0xfb; cmd[1]= 0x00;
d34d 1:a5dbc8a15c83 17 _i2c.write(NUNCHUCK_ADDR, (const char*)cmd, sizeof(cmd));
d34d 1:a5dbc8a15c83 18 }
d34d 1:a5dbc8a15c83 19
d34d 1:a5dbc8a15c83 20 bool WiiChuck::read(nunchuck_data_t* data) {
d34d 1:a5dbc8a15c83 21 char readBuf[NUNCHUCK_READLEN];
d34d 1:a5dbc8a15c83 22
d34d 3:fcc2f24d0644 23 if (!_initialized) {
d34d 1:a5dbc8a15c83 24 return false;
d34d 1:a5dbc8a15c83 25 }
d34d 1:a5dbc8a15c83 26
d34d 3:fcc2f24d0644 27 const char cmd[] = {0x00};
d34d 1:a5dbc8a15c83 28 if (_i2c.write(NUNCHUCK_ADDR, (const char*)cmd, sizeof(cmd)) == I2C_ACK) {
d34d 1:a5dbc8a15c83 29 wait(I2C_READ_DELAY);
d34d 1:a5dbc8a15c83 30 if (_i2c.read(NUNCHUCK_ADDR, readBuf, sizeof(readBuf)) == I2C_ACK) {
d34d 2:9c4ac1a64c30 31 data->joyX = readBuf[JOY_X_IDX];
d34d 2:9c4ac1a64c30 32 data->joyY = readBuf[JOY_Y_IDX];
d34d 2:9c4ac1a64c30 33 data->accX = (uint16_t) readBuf[ACC_X_IDX] << 2 + ((readBuf[BUTTON_IDX] >> 2) & 0x03);
d34d 2:9c4ac1a64c30 34 data->accY = (uint16_t) readBuf[ACC_Y_IDX] << 2 + ((readBuf[BUTTON_IDX] >> 4) & 0x03);
d34d 2:9c4ac1a64c30 35 data->accZ = (uint16_t) readBuf[ACC_Z_IDX] << 2 + ((readBuf[BUTTON_IDX] >> 6) & 0x03);
d34d 1:a5dbc8a15c83 36
d34d 2:9c4ac1a64c30 37 data->buttonZ = !(readBuf[BUTTON_IDX] & 0x01);
d34d 2:9c4ac1a64c30 38 data->buttonC = !(readBuf[BUTTON_IDX] & 0x02);
d34d 1:a5dbc8a15c83 39 return true;
d34d 1:a5dbc8a15c83 40 }
d34d 1:a5dbc8a15c83 41 }
d34d 1:a5dbc8a15c83 42
d34d 1:a5dbc8a15c83 43 return false;
d34d 1:a5dbc8a15c83 44 }
d34d 1:a5dbc8a15c83 45
d34d 2:9c4ac1a64c30 46 void WiiChuck::attach(pt2Func function, float t) {
d34d 2:9c4ac1a64c30 47 _callback = function;
d34d 2:9c4ac1a64c30 48 _getValues.attach(this, &WiiChuck::getValues, t);
d34d 1:a5dbc8a15c83 49 }
d34d 3:fcc2f24d0644 50
d34d 2:9c4ac1a64c30 51 void WiiChuck::detach() {
d34d 1:a5dbc8a15c83 52 _getValues.detach();
d34d 2:9c4ac1a64c30 53 _callback = NULL;
d34d 1:a5dbc8a15c83 54 }
d34d 1:a5dbc8a15c83 55
d34d 5:be9ce129de7c 56 bool WiiChuck::calibrateJoystickNeutralPosition(uint8_t* centerX, uint8_t* centerY) {
d34d 5:be9ce129de7c 57 if (!_initialized) return false;
d34d 5:be9ce129de7c 58
d34d 5:be9ce129de7c 59 nunchuck_data_t data;
d34d 5:be9ce129de7c 60 uint16_t tempX = 0, tempY = 0;
d34d 5:be9ce129de7c 61
d34d 5:be9ce129de7c 62 for (size_t i = 0; i < 8; i++) {
d34d 5:be9ce129de7c 63 if (!this->read(&data)) return false;
d34d 5:be9ce129de7c 64
d34d 5:be9ce129de7c 65 tempX += data.joyX;
d34d 5:be9ce129de7c 66 tempY += data.joyY;
d34d 5:be9ce129de7c 67 }
d34d 5:be9ce129de7c 68
d34d 5:be9ce129de7c 69 // take the average of the readings ( >> 3 == / 8)
d34d 5:be9ce129de7c 70 *centerX = tempX >> 3;
d34d 5:be9ce129de7c 71 *centerY = tempY >> 3;
d34d 5:be9ce129de7c 72 return true;
d34d 5:be9ce129de7c 73 }
d34d 5:be9ce129de7c 74
d34d 2:9c4ac1a64c30 75 void WiiChuck::getValues() {
d34d 2:9c4ac1a64c30 76 bool hasData = read(&_data);
d34d 1:a5dbc8a15c83 77
d34d 3:fcc2f24d0644 78 if(hasData && _callback != NULL) {
d34d 2:9c4ac1a64c30 79 _callback(&_data);
d34d 1:a5dbc8a15c83 80 }
d34d 1:a5dbc8a15c83 81 }