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