Revision of \"WiiChuck\" to use \"new\" initialization process that is compatible with 3rd party nunchuk controllers
WiiChuk_compat.c@0:e84a5ccbac19, 2011-03-14 (annotated)
- Committer:
- gbrush
- Date:
- Mon Mar 14 23:47:12 2011 +0000
- Revision:
- 0:e84a5ccbac19
Initial
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
gbrush | 0:e84a5ccbac19 | 1 | #include "WiiChuk_compat.h" |
gbrush | 0:e84a5ccbac19 | 2 | |
gbrush | 0:e84a5ccbac19 | 3 | |
gbrush | 0:e84a5ccbac19 | 4 | |
gbrush | 0:e84a5ccbac19 | 5 | WiiChuck::WiiChuck(PinName data, PinName clk):_i2c(data, clk) { |
gbrush | 0:e84a5ccbac19 | 6 | _i2c.frequency(400000); // should work at 100000 too |
gbrush | 0:e84a5ccbac19 | 7 | Error = true; |
gbrush | 0:e84a5ccbac19 | 8 | |
gbrush | 0:e84a5ccbac19 | 9 | // initialize Wii extension (nunchuk) based on "new way" initialization |
gbrush | 0:e84a5ccbac19 | 10 | // http://wiibrew.org/wiki/Wiimote#The_New_Way |
gbrush | 0:e84a5ccbac19 | 11 | // also disables need for decryption |
gbrush | 0:e84a5ccbac19 | 12 | |
gbrush | 0:e84a5ccbac19 | 13 | unsigned char cmd[] = {0xF0, 0x55}; |
gbrush | 0:e84a5ccbac19 | 14 | if (_i2c.write(NUNCHUCK_ADDR, (const char*)cmd, sizeof(cmd)) == I2C_ACK) { |
gbrush | 0:e84a5ccbac19 | 15 | Error = false; |
gbrush | 0:e84a5ccbac19 | 16 | } |
gbrush | 0:e84a5ccbac19 | 17 | |
gbrush | 0:e84a5ccbac19 | 18 | cmd[0] = 0xfb; cmd[1]= 0x00; |
gbrush | 0:e84a5ccbac19 | 19 | _i2c.write(NUNCHUCK_ADDR, (const char*)cmd, sizeof(cmd)); |
gbrush | 0:e84a5ccbac19 | 20 | |
gbrush | 0:e84a5ccbac19 | 21 | _oldC = 0; |
gbrush | 0:e84a5ccbac19 | 22 | _oldZ = 0; |
gbrush | 0:e84a5ccbac19 | 23 | } |
gbrush | 0:e84a5ccbac19 | 24 | |
gbrush | 0:e84a5ccbac19 | 25 | bool WiiChuck::Read(int* joyX,int* joyY,int* accX,int* accY,int* accZ,int* buttonC,int* buttonZ) { |
gbrush | 0:e84a5ccbac19 | 26 | |
gbrush | 0:e84a5ccbac19 | 27 | //int i; |
gbrush | 0:e84a5ccbac19 | 28 | char readBuf[NUNCHUCK_READLEN]; |
gbrush | 0:e84a5ccbac19 | 29 | |
gbrush | 0:e84a5ccbac19 | 30 | if (Error) { |
gbrush | 0:e84a5ccbac19 | 31 | return false; |
gbrush | 0:e84a5ccbac19 | 32 | } |
gbrush | 0:e84a5ccbac19 | 33 | |
gbrush | 0:e84a5ccbac19 | 34 | const unsigned char cmd[] = {0x00}; |
gbrush | 0:e84a5ccbac19 | 35 | if (_i2c.write(NUNCHUCK_ADDR, (const char*)cmd, sizeof(cmd)) == I2C_ACK) { |
gbrush | 0:e84a5ccbac19 | 36 | wait(I2C_READ_DELAY); |
gbrush | 0:e84a5ccbac19 | 37 | if (_i2c.read(NUNCHUCK_ADDR, readBuf, sizeof(readBuf)) == I2C_ACK) { |
gbrush | 0:e84a5ccbac19 | 38 | //init values |
gbrush | 0:e84a5ccbac19 | 39 | *joyX = 0; *joyY = 0; *accX = 0; *accY = 0; *accZ = 0; *buttonC = 0; *buttonZ = 0; |
gbrush | 0:e84a5ccbac19 | 40 | |
gbrush | 0:e84a5ccbac19 | 41 | /* Decrypting not required with new initialization |
gbrush | 0:e84a5ccbac19 | 42 | for (i = 0; i < NUNCHUCK_READLEN; ++i) { |
gbrush | 0:e84a5ccbac19 | 43 | readBuf[i] = (readBuf[i] ^ 0x17) + 0x17; |
gbrush | 0:e84a5ccbac19 | 44 | } |
gbrush | 0:e84a5ccbac19 | 45 | */ |
gbrush | 0:e84a5ccbac19 | 46 | |
gbrush | 0:e84a5ccbac19 | 47 | *joyX = readBuf[Joy_X]; |
gbrush | 0:e84a5ccbac19 | 48 | *joyY = readBuf[Joy_Y]; |
gbrush | 0:e84a5ccbac19 | 49 | *accX = readBuf[Acc_X] << 2; |
gbrush | 0:e84a5ccbac19 | 50 | *accY = readBuf[Acc_Y] << 2; |
gbrush | 0:e84a5ccbac19 | 51 | *accZ = readBuf[Acc_Z] << 2; |
gbrush | 0:e84a5ccbac19 | 52 | |
gbrush | 0:e84a5ccbac19 | 53 | if (readBuf[Button] & 0x01) { |
gbrush | 0:e84a5ccbac19 | 54 | *buttonZ = 0; |
gbrush | 0:e84a5ccbac19 | 55 | } else { |
gbrush | 0:e84a5ccbac19 | 56 | *buttonZ = 1; |
gbrush | 0:e84a5ccbac19 | 57 | } |
gbrush | 0:e84a5ccbac19 | 58 | if (readBuf[Button] & 0x02) { |
gbrush | 0:e84a5ccbac19 | 59 | *buttonC = 0; |
gbrush | 0:e84a5ccbac19 | 60 | } else { |
gbrush | 0:e84a5ccbac19 | 61 | *buttonC = 1; |
gbrush | 0:e84a5ccbac19 | 62 | } |
gbrush | 0:e84a5ccbac19 | 63 | if (readBuf[Button] & 0x04) accX += 2; |
gbrush | 0:e84a5ccbac19 | 64 | if (readBuf[Button] & 0x08) accX += 1; |
gbrush | 0:e84a5ccbac19 | 65 | if (readBuf[Button] & 0x10) accY += 2; |
gbrush | 0:e84a5ccbac19 | 66 | if (readBuf[Button] & 0x20) accY += 1; |
gbrush | 0:e84a5ccbac19 | 67 | if (readBuf[Button] & 0x40) accZ += 2; |
gbrush | 0:e84a5ccbac19 | 68 | if (readBuf[Button] & 0x80) accZ += 1; |
gbrush | 0:e84a5ccbac19 | 69 | return true; |
gbrush | 0:e84a5ccbac19 | 70 | } |
gbrush | 0:e84a5ccbac19 | 71 | else |
gbrush | 0:e84a5ccbac19 | 72 | { |
gbrush | 0:e84a5ccbac19 | 73 | return false; |
gbrush | 0:e84a5ccbac19 | 74 | } |
gbrush | 0:e84a5ccbac19 | 75 | } else { |
gbrush | 0:e84a5ccbac19 | 76 | return false; |
gbrush | 0:e84a5ccbac19 | 77 | } |
gbrush | 0:e84a5ccbac19 | 78 | |
gbrush | 0:e84a5ccbac19 | 79 | } |
gbrush | 0:e84a5ccbac19 | 80 | |
gbrush | 0:e84a5ccbac19 | 81 | void WiiChuck::start() |
gbrush | 0:e84a5ccbac19 | 82 | { |
gbrush | 0:e84a5ccbac19 | 83 | _getValues.attach(this, &WiiChuck::getValues,0.2); |
gbrush | 0:e84a5ccbac19 | 84 | } |
gbrush | 0:e84a5ccbac19 | 85 | void WiiChuck::stop() |
gbrush | 0:e84a5ccbac19 | 86 | { |
gbrush | 0:e84a5ccbac19 | 87 | _getValues.detach(); |
gbrush | 0:e84a5ccbac19 | 88 | } |
gbrush | 0:e84a5ccbac19 | 89 | |
gbrush | 0:e84a5ccbac19 | 90 | void WiiChuck::getValues() |
gbrush | 0:e84a5ccbac19 | 91 | { |
gbrush | 0:e84a5ccbac19 | 92 | int joyX = 0;int joyY = 0; |
gbrush | 0:e84a5ccbac19 | 93 | int accX = 0;int accY = 0;int accZ = 0; |
gbrush | 0:e84a5ccbac19 | 94 | int buttonC = 0;int buttonZ = 0; |
gbrush | 0:e84a5ccbac19 | 95 | |
gbrush | 0:e84a5ccbac19 | 96 | bool read = Read(&joyX,&joyY,&accX,&accY,&accZ,&buttonC,&buttonZ); |
gbrush | 0:e84a5ccbac19 | 97 | |
gbrush | 0:e84a5ccbac19 | 98 | if(read) |
gbrush | 0:e84a5ccbac19 | 99 | { |
gbrush | 0:e84a5ccbac19 | 100 | //analyse |
gbrush | 0:e84a5ccbac19 | 101 | if(_oldC == 0 && buttonC == 1) |
gbrush | 0:e84a5ccbac19 | 102 | { |
gbrush | 0:e84a5ccbac19 | 103 | _oldC = 1; |
gbrush | 0:e84a5ccbac19 | 104 | _callback_input(BUTTON_CANCEL_VALUE); |
gbrush | 0:e84a5ccbac19 | 105 | return; |
gbrush | 0:e84a5ccbac19 | 106 | } |
gbrush | 0:e84a5ccbac19 | 107 | else |
gbrush | 0:e84a5ccbac19 | 108 | { |
gbrush | 0:e84a5ccbac19 | 109 | _oldC = buttonC; |
gbrush | 0:e84a5ccbac19 | 110 | } |
gbrush | 0:e84a5ccbac19 | 111 | |
gbrush | 0:e84a5ccbac19 | 112 | //analyse |
gbrush | 0:e84a5ccbac19 | 113 | if(_oldZ == 0 && buttonZ == 1) |
gbrush | 0:e84a5ccbac19 | 114 | { |
gbrush | 0:e84a5ccbac19 | 115 | _oldZ = 1; |
gbrush | 0:e84a5ccbac19 | 116 | _callback_input(BUTTON_OK_VALUE); |
gbrush | 0:e84a5ccbac19 | 117 | return; |
gbrush | 0:e84a5ccbac19 | 118 | } |
gbrush | 0:e84a5ccbac19 | 119 | else |
gbrush | 0:e84a5ccbac19 | 120 | { |
gbrush | 0:e84a5ccbac19 | 121 | _oldZ = buttonZ; |
gbrush | 0:e84a5ccbac19 | 122 | } |
gbrush | 0:e84a5ccbac19 | 123 | |
gbrush | 0:e84a5ccbac19 | 124 | if(joyY>160) |
gbrush | 0:e84a5ccbac19 | 125 | { |
gbrush | 0:e84a5ccbac19 | 126 | _callback_input(BUTTON_VOLUME_PLUS); |
gbrush | 0:e84a5ccbac19 | 127 | return; |
gbrush | 0:e84a5ccbac19 | 128 | } |
gbrush | 0:e84a5ccbac19 | 129 | if(joyY<80) |
gbrush | 0:e84a5ccbac19 | 130 | { |
gbrush | 0:e84a5ccbac19 | 131 | |
gbrush | 0:e84a5ccbac19 | 132 | _callback_input(BUTTON_VOLUME_MINUS); |
gbrush | 0:e84a5ccbac19 | 133 | return; |
gbrush | 0:e84a5ccbac19 | 134 | } |
gbrush | 0:e84a5ccbac19 | 135 | if(joyX>160) |
gbrush | 0:e84a5ccbac19 | 136 | { |
gbrush | 0:e84a5ccbac19 | 137 | _callback_input(BUTTON_NEXT_VALUE); |
gbrush | 0:e84a5ccbac19 | 138 | return; |
gbrush | 0:e84a5ccbac19 | 139 | } |
gbrush | 0:e84a5ccbac19 | 140 | if(joyX<80) |
gbrush | 0:e84a5ccbac19 | 141 | { |
gbrush | 0:e84a5ccbac19 | 142 | |
gbrush | 0:e84a5ccbac19 | 143 | _callback_input(BUTTON_PREV_VALUE); |
gbrush | 0:e84a5ccbac19 | 144 | return; |
gbrush | 0:e84a5ccbac19 | 145 | } |
gbrush | 0:e84a5ccbac19 | 146 | |
gbrush | 0:e84a5ccbac19 | 147 | } |
gbrush | 0:e84a5ccbac19 | 148 | } |
gbrush | 0:e84a5ccbac19 | 149 | void WiiChuck::attach(pt2Func function) |
gbrush | 0:e84a5ccbac19 | 150 | { |
gbrush | 0:e84a5ccbac19 | 151 | _callback_input = function; |
gbrush | 0:e84a5ccbac19 | 152 | } |
gbrush | 0:e84a5ccbac19 | 153 | |
gbrush | 0:e84a5ccbac19 | 154 |