Generalized adaptation of the WiiChuk_compat library.
Fork of WiiChuk_compat by
WiiChuck.cpp@5:be9ce129de7c, 2014-12-22 (annotated)
- 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?
User | Revision | Line number | New 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 | } |