Wii Nunchuk module with nasty hacks from debugging on a FRDM-KL25Z
Fork of WiiChuk_compat by
WiiChuk_compat.cpp@1:7ff30607465f, 2015-06-08 (annotated)
- Committer:
- eisd
- Date:
- Mon Jun 08 15:31:50 2015 +0000
- Revision:
- 1:7ff30607465f
- Parent:
- WiiChuk_compat.c@0:e84a5ccbac19
- Child:
- 2:566662f892b1
WiiChuck serial debug
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
eisd | 1:7ff30607465f | 1 | #include "WiiChuk_compat.hpp" |
gbrush | 0:e84a5ccbac19 | 2 | |
gbrush | 0:e84a5ccbac19 | 3 | |
gbrush | 0:e84a5ccbac19 | 4 | |
eisd | 1:7ff30607465f | 5 | WiiChuck::WiiChuck(PinName data, PinName clk, Stream &_pc):_i2c(data, clk), pc(_pc) { |
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}; |
eisd | 1:7ff30607465f | 14 | if (_i2c.write(NUNCHUCK_ADDR, (const char*)cmd, sizeof(cmd), true) == 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; |
eisd | 1:7ff30607465f | 19 | pc.printf("WiiChuck init nack %i\r\n", _i2c.write(NUNCHUCK_ADDR, (const char*)cmd, sizeof(cmd), true)); |
eisd | 1:7ff30607465f | 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 | |
eisd | 1:7ff30607465f | 41 | pc.printf("\r\n"); |
eisd | 1:7ff30607465f | 42 | // Decrypting not required with new initialization |
eisd | 1:7ff30607465f | 43 | for (int i = 0; i < NUNCHUCK_READLEN; ++i) { |
eisd | 1:7ff30607465f | 44 | // readBuf[i] = (readBuf[i] ^ 0x17) + 0x17; |
eisd | 1:7ff30607465f | 45 | pc.printf("%i ", readBuf[i]); |
gbrush | 0:e84a5ccbac19 | 46 | } |
eisd | 1:7ff30607465f | 47 | pc.printf("\r\n"); |
eisd | 1:7ff30607465f | 48 | |
gbrush | 0:e84a5ccbac19 | 49 | |
gbrush | 0:e84a5ccbac19 | 50 | *joyX = readBuf[Joy_X]; |
gbrush | 0:e84a5ccbac19 | 51 | *joyY = readBuf[Joy_Y]; |
gbrush | 0:e84a5ccbac19 | 52 | *accX = readBuf[Acc_X] << 2; |
gbrush | 0:e84a5ccbac19 | 53 | *accY = readBuf[Acc_Y] << 2; |
gbrush | 0:e84a5ccbac19 | 54 | *accZ = readBuf[Acc_Z] << 2; |
gbrush | 0:e84a5ccbac19 | 55 | |
gbrush | 0:e84a5ccbac19 | 56 | if (readBuf[Button] & 0x01) { |
gbrush | 0:e84a5ccbac19 | 57 | *buttonZ = 0; |
gbrush | 0:e84a5ccbac19 | 58 | } else { |
gbrush | 0:e84a5ccbac19 | 59 | *buttonZ = 1; |
gbrush | 0:e84a5ccbac19 | 60 | } |
gbrush | 0:e84a5ccbac19 | 61 | if (readBuf[Button] & 0x02) { |
gbrush | 0:e84a5ccbac19 | 62 | *buttonC = 0; |
gbrush | 0:e84a5ccbac19 | 63 | } else { |
gbrush | 0:e84a5ccbac19 | 64 | *buttonC = 1; |
gbrush | 0:e84a5ccbac19 | 65 | } |
gbrush | 0:e84a5ccbac19 | 66 | if (readBuf[Button] & 0x04) accX += 2; |
gbrush | 0:e84a5ccbac19 | 67 | if (readBuf[Button] & 0x08) accX += 1; |
gbrush | 0:e84a5ccbac19 | 68 | if (readBuf[Button] & 0x10) accY += 2; |
gbrush | 0:e84a5ccbac19 | 69 | if (readBuf[Button] & 0x20) accY += 1; |
gbrush | 0:e84a5ccbac19 | 70 | if (readBuf[Button] & 0x40) accZ += 2; |
gbrush | 0:e84a5ccbac19 | 71 | if (readBuf[Button] & 0x80) accZ += 1; |
gbrush | 0:e84a5ccbac19 | 72 | return true; |
gbrush | 0:e84a5ccbac19 | 73 | } |
gbrush | 0:e84a5ccbac19 | 74 | else |
gbrush | 0:e84a5ccbac19 | 75 | { |
eisd | 1:7ff30607465f | 76 | pc.printf("no read ack\r\n"); |
gbrush | 0:e84a5ccbac19 | 77 | return false; |
gbrush | 0:e84a5ccbac19 | 78 | } |
gbrush | 0:e84a5ccbac19 | 79 | } else { |
eisd | 1:7ff30607465f | 80 | pc.printf("no write ack\r\n"); |
gbrush | 0:e84a5ccbac19 | 81 | return false; |
gbrush | 0:e84a5ccbac19 | 82 | } |
gbrush | 0:e84a5ccbac19 | 83 | |
gbrush | 0:e84a5ccbac19 | 84 | } |
gbrush | 0:e84a5ccbac19 | 85 | |
gbrush | 0:e84a5ccbac19 | 86 | void WiiChuck::start() |
gbrush | 0:e84a5ccbac19 | 87 | { |
gbrush | 0:e84a5ccbac19 | 88 | _getValues.attach(this, &WiiChuck::getValues,0.2); |
gbrush | 0:e84a5ccbac19 | 89 | } |
gbrush | 0:e84a5ccbac19 | 90 | void WiiChuck::stop() |
gbrush | 0:e84a5ccbac19 | 91 | { |
gbrush | 0:e84a5ccbac19 | 92 | _getValues.detach(); |
gbrush | 0:e84a5ccbac19 | 93 | } |
gbrush | 0:e84a5ccbac19 | 94 | |
gbrush | 0:e84a5ccbac19 | 95 | void WiiChuck::getValues() |
gbrush | 0:e84a5ccbac19 | 96 | { |
gbrush | 0:e84a5ccbac19 | 97 | int joyX = 0;int joyY = 0; |
gbrush | 0:e84a5ccbac19 | 98 | int accX = 0;int accY = 0;int accZ = 0; |
gbrush | 0:e84a5ccbac19 | 99 | int buttonC = 0;int buttonZ = 0; |
gbrush | 0:e84a5ccbac19 | 100 | |
gbrush | 0:e84a5ccbac19 | 101 | bool read = Read(&joyX,&joyY,&accX,&accY,&accZ,&buttonC,&buttonZ); |
gbrush | 0:e84a5ccbac19 | 102 | |
gbrush | 0:e84a5ccbac19 | 103 | if(read) |
gbrush | 0:e84a5ccbac19 | 104 | { |
gbrush | 0:e84a5ccbac19 | 105 | //analyse |
gbrush | 0:e84a5ccbac19 | 106 | if(_oldC == 0 && buttonC == 1) |
gbrush | 0:e84a5ccbac19 | 107 | { |
gbrush | 0:e84a5ccbac19 | 108 | _oldC = 1; |
gbrush | 0:e84a5ccbac19 | 109 | _callback_input(BUTTON_CANCEL_VALUE); |
gbrush | 0:e84a5ccbac19 | 110 | return; |
gbrush | 0:e84a5ccbac19 | 111 | } |
gbrush | 0:e84a5ccbac19 | 112 | else |
gbrush | 0:e84a5ccbac19 | 113 | { |
gbrush | 0:e84a5ccbac19 | 114 | _oldC = buttonC; |
gbrush | 0:e84a5ccbac19 | 115 | } |
gbrush | 0:e84a5ccbac19 | 116 | |
gbrush | 0:e84a5ccbac19 | 117 | //analyse |
gbrush | 0:e84a5ccbac19 | 118 | if(_oldZ == 0 && buttonZ == 1) |
gbrush | 0:e84a5ccbac19 | 119 | { |
gbrush | 0:e84a5ccbac19 | 120 | _oldZ = 1; |
gbrush | 0:e84a5ccbac19 | 121 | _callback_input(BUTTON_OK_VALUE); |
gbrush | 0:e84a5ccbac19 | 122 | return; |
gbrush | 0:e84a5ccbac19 | 123 | } |
gbrush | 0:e84a5ccbac19 | 124 | else |
gbrush | 0:e84a5ccbac19 | 125 | { |
gbrush | 0:e84a5ccbac19 | 126 | _oldZ = buttonZ; |
gbrush | 0:e84a5ccbac19 | 127 | } |
gbrush | 0:e84a5ccbac19 | 128 | |
gbrush | 0:e84a5ccbac19 | 129 | if(joyY>160) |
gbrush | 0:e84a5ccbac19 | 130 | { |
gbrush | 0:e84a5ccbac19 | 131 | _callback_input(BUTTON_VOLUME_PLUS); |
gbrush | 0:e84a5ccbac19 | 132 | return; |
gbrush | 0:e84a5ccbac19 | 133 | } |
gbrush | 0:e84a5ccbac19 | 134 | if(joyY<80) |
gbrush | 0:e84a5ccbac19 | 135 | { |
gbrush | 0:e84a5ccbac19 | 136 | |
gbrush | 0:e84a5ccbac19 | 137 | _callback_input(BUTTON_VOLUME_MINUS); |
gbrush | 0:e84a5ccbac19 | 138 | return; |
gbrush | 0:e84a5ccbac19 | 139 | } |
gbrush | 0:e84a5ccbac19 | 140 | if(joyX>160) |
gbrush | 0:e84a5ccbac19 | 141 | { |
gbrush | 0:e84a5ccbac19 | 142 | _callback_input(BUTTON_NEXT_VALUE); |
gbrush | 0:e84a5ccbac19 | 143 | return; |
gbrush | 0:e84a5ccbac19 | 144 | } |
gbrush | 0:e84a5ccbac19 | 145 | if(joyX<80) |
gbrush | 0:e84a5ccbac19 | 146 | { |
gbrush | 0:e84a5ccbac19 | 147 | |
gbrush | 0:e84a5ccbac19 | 148 | _callback_input(BUTTON_PREV_VALUE); |
gbrush | 0:e84a5ccbac19 | 149 | return; |
gbrush | 0:e84a5ccbac19 | 150 | } |
gbrush | 0:e84a5ccbac19 | 151 | |
gbrush | 0:e84a5ccbac19 | 152 | } |
gbrush | 0:e84a5ccbac19 | 153 | } |
gbrush | 0:e84a5ccbac19 | 154 | void WiiChuck::attach(pt2Func function) |
gbrush | 0:e84a5ccbac19 | 155 | { |
gbrush | 0:e84a5ccbac19 | 156 | _callback_input = function; |
gbrush | 0:e84a5ccbac19 | 157 | } |
gbrush | 0:e84a5ccbac19 | 158 | |
gbrush | 0:e84a5ccbac19 | 159 |