Wii Nunchuk module with nasty hacks from debugging on a FRDM-KL25Z
Fork of WiiChuk_compat by
WiiChuk_compat.cpp@4:bf058247fb2f, 2017-01-04 (annotated)
- Committer:
- eisd
- Date:
- Wed Jan 04 06:20:50 2017 +0000
- Revision:
- 4:bf058247fb2f
- Parent:
- 2:566662f892b1
Reduce debugging
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) { |
eisd | 2:566662f892b1 | 6 | _i2c.frequency(50000); // 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 | 4:bf058247fb2f | 19 | //pc.printf("%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 | |
eisd | 2:566662f892b1 | 25 | bool WiiChuck::Read(uint8_t* joyX, uint8_t* joyY, uint16_t* accX, uint16_t* accY, uint16_t* accZ, uint8_t* buttonC, uint8_t* 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 |
eisd | 2:566662f892b1 | 39 | //n->X = 0; n->Y = 0; n->aX = 0; n->aY = 0; n->aZ = 0; n->C = 0; n->Z = 0; |
gbrush | 0:e84a5ccbac19 | 40 | *joyX = 0; *joyY = 0; *accX = 0; *accY = 0; *accZ = 0; *buttonC = 0; *buttonZ = 0; |
eisd | 2:566662f892b1 | 41 | /* |
eisd | 1:7ff30607465f | 42 | pc.printf("\r\n"); |
eisd | 1:7ff30607465f | 43 | // Decrypting not required with new initialization |
eisd | 1:7ff30607465f | 44 | for (int i = 0; i < NUNCHUCK_READLEN; ++i) { |
eisd | 1:7ff30607465f | 45 | // readBuf[i] = (readBuf[i] ^ 0x17) + 0x17; |
eisd | 1:7ff30607465f | 46 | pc.printf("%i ", readBuf[i]); |
gbrush | 0:e84a5ccbac19 | 47 | } |
eisd | 1:7ff30607465f | 48 | pc.printf("\r\n"); |
eisd | 2:566662f892b1 | 49 | */ |
gbrush | 0:e84a5ccbac19 | 50 | |
gbrush | 0:e84a5ccbac19 | 51 | *joyX = readBuf[Joy_X]; |
gbrush | 0:e84a5ccbac19 | 52 | *joyY = readBuf[Joy_Y]; |
gbrush | 0:e84a5ccbac19 | 53 | *accX = readBuf[Acc_X] << 2; |
gbrush | 0:e84a5ccbac19 | 54 | *accY = readBuf[Acc_Y] << 2; |
gbrush | 0:e84a5ccbac19 | 55 | *accZ = readBuf[Acc_Z] << 2; |
gbrush | 0:e84a5ccbac19 | 56 | |
gbrush | 0:e84a5ccbac19 | 57 | if (readBuf[Button] & 0x01) { |
gbrush | 0:e84a5ccbac19 | 58 | *buttonZ = 0; |
gbrush | 0:e84a5ccbac19 | 59 | } else { |
gbrush | 0:e84a5ccbac19 | 60 | *buttonZ = 1; |
gbrush | 0:e84a5ccbac19 | 61 | } |
gbrush | 0:e84a5ccbac19 | 62 | if (readBuf[Button] & 0x02) { |
gbrush | 0:e84a5ccbac19 | 63 | *buttonC = 0; |
gbrush | 0:e84a5ccbac19 | 64 | } else { |
gbrush | 0:e84a5ccbac19 | 65 | *buttonC = 1; |
gbrush | 0:e84a5ccbac19 | 66 | } |
gbrush | 0:e84a5ccbac19 | 67 | if (readBuf[Button] & 0x04) accX += 2; |
gbrush | 0:e84a5ccbac19 | 68 | if (readBuf[Button] & 0x08) accX += 1; |
gbrush | 0:e84a5ccbac19 | 69 | if (readBuf[Button] & 0x10) accY += 2; |
gbrush | 0:e84a5ccbac19 | 70 | if (readBuf[Button] & 0x20) accY += 1; |
gbrush | 0:e84a5ccbac19 | 71 | if (readBuf[Button] & 0x40) accZ += 2; |
gbrush | 0:e84a5ccbac19 | 72 | if (readBuf[Button] & 0x80) accZ += 1; |
gbrush | 0:e84a5ccbac19 | 73 | return true; |
gbrush | 0:e84a5ccbac19 | 74 | } |
gbrush | 0:e84a5ccbac19 | 75 | else |
gbrush | 0:e84a5ccbac19 | 76 | { |
eisd | 1:7ff30607465f | 77 | pc.printf("no read ack\r\n"); |
gbrush | 0:e84a5ccbac19 | 78 | return false; |
gbrush | 0:e84a5ccbac19 | 79 | } |
gbrush | 0:e84a5ccbac19 | 80 | } else { |
eisd | 1:7ff30607465f | 81 | pc.printf("no write ack\r\n"); |
gbrush | 0:e84a5ccbac19 | 82 | return false; |
gbrush | 0:e84a5ccbac19 | 83 | } |
gbrush | 0:e84a5ccbac19 | 84 | |
gbrush | 0:e84a5ccbac19 | 85 | } |
gbrush | 0:e84a5ccbac19 | 86 | |
gbrush | 0:e84a5ccbac19 | 87 | void WiiChuck::start() |
gbrush | 0:e84a5ccbac19 | 88 | { |
gbrush | 0:e84a5ccbac19 | 89 | _getValues.attach(this, &WiiChuck::getValues,0.2); |
gbrush | 0:e84a5ccbac19 | 90 | } |
gbrush | 0:e84a5ccbac19 | 91 | void WiiChuck::stop() |
gbrush | 0:e84a5ccbac19 | 92 | { |
gbrush | 0:e84a5ccbac19 | 93 | _getValues.detach(); |
gbrush | 0:e84a5ccbac19 | 94 | } |
gbrush | 0:e84a5ccbac19 | 95 | |
gbrush | 0:e84a5ccbac19 | 96 | void WiiChuck::getValues() |
gbrush | 0:e84a5ccbac19 | 97 | { |
eisd | 2:566662f892b1 | 98 | uint8_t joyX = 0, joyY = 0; |
eisd | 2:566662f892b1 | 99 | uint16_t accX = 0, accY = 0, accZ = 0; |
eisd | 2:566662f892b1 | 100 | uint8_t buttonC = 0, buttonZ = 0; |
gbrush | 0:e84a5ccbac19 | 101 | |
gbrush | 0:e84a5ccbac19 | 102 | bool read = Read(&joyX,&joyY,&accX,&accY,&accZ,&buttonC,&buttonZ); |
gbrush | 0:e84a5ccbac19 | 103 | |
gbrush | 0:e84a5ccbac19 | 104 | if(read) |
gbrush | 0:e84a5ccbac19 | 105 | { |
gbrush | 0:e84a5ccbac19 | 106 | //analyse |
gbrush | 0:e84a5ccbac19 | 107 | if(_oldC == 0 && buttonC == 1) |
gbrush | 0:e84a5ccbac19 | 108 | { |
gbrush | 0:e84a5ccbac19 | 109 | _oldC = 1; |
gbrush | 0:e84a5ccbac19 | 110 | _callback_input(BUTTON_CANCEL_VALUE); |
gbrush | 0:e84a5ccbac19 | 111 | return; |
gbrush | 0:e84a5ccbac19 | 112 | } |
gbrush | 0:e84a5ccbac19 | 113 | else |
gbrush | 0:e84a5ccbac19 | 114 | { |
gbrush | 0:e84a5ccbac19 | 115 | _oldC = buttonC; |
gbrush | 0:e84a5ccbac19 | 116 | } |
gbrush | 0:e84a5ccbac19 | 117 | |
gbrush | 0:e84a5ccbac19 | 118 | //analyse |
gbrush | 0:e84a5ccbac19 | 119 | if(_oldZ == 0 && buttonZ == 1) |
gbrush | 0:e84a5ccbac19 | 120 | { |
gbrush | 0:e84a5ccbac19 | 121 | _oldZ = 1; |
gbrush | 0:e84a5ccbac19 | 122 | _callback_input(BUTTON_OK_VALUE); |
gbrush | 0:e84a5ccbac19 | 123 | return; |
gbrush | 0:e84a5ccbac19 | 124 | } |
gbrush | 0:e84a5ccbac19 | 125 | else |
gbrush | 0:e84a5ccbac19 | 126 | { |
gbrush | 0:e84a5ccbac19 | 127 | _oldZ = buttonZ; |
gbrush | 0:e84a5ccbac19 | 128 | } |
gbrush | 0:e84a5ccbac19 | 129 | |
gbrush | 0:e84a5ccbac19 | 130 | if(joyY>160) |
gbrush | 0:e84a5ccbac19 | 131 | { |
gbrush | 0:e84a5ccbac19 | 132 | _callback_input(BUTTON_VOLUME_PLUS); |
gbrush | 0:e84a5ccbac19 | 133 | return; |
gbrush | 0:e84a5ccbac19 | 134 | } |
gbrush | 0:e84a5ccbac19 | 135 | if(joyY<80) |
gbrush | 0:e84a5ccbac19 | 136 | { |
gbrush | 0:e84a5ccbac19 | 137 | |
gbrush | 0:e84a5ccbac19 | 138 | _callback_input(BUTTON_VOLUME_MINUS); |
gbrush | 0:e84a5ccbac19 | 139 | return; |
gbrush | 0:e84a5ccbac19 | 140 | } |
gbrush | 0:e84a5ccbac19 | 141 | if(joyX>160) |
gbrush | 0:e84a5ccbac19 | 142 | { |
gbrush | 0:e84a5ccbac19 | 143 | _callback_input(BUTTON_NEXT_VALUE); |
gbrush | 0:e84a5ccbac19 | 144 | return; |
gbrush | 0:e84a5ccbac19 | 145 | } |
gbrush | 0:e84a5ccbac19 | 146 | if(joyX<80) |
gbrush | 0:e84a5ccbac19 | 147 | { |
gbrush | 0:e84a5ccbac19 | 148 | |
gbrush | 0:e84a5ccbac19 | 149 | _callback_input(BUTTON_PREV_VALUE); |
gbrush | 0:e84a5ccbac19 | 150 | return; |
gbrush | 0:e84a5ccbac19 | 151 | } |
gbrush | 0:e84a5ccbac19 | 152 | |
gbrush | 0:e84a5ccbac19 | 153 | } |
gbrush | 0:e84a5ccbac19 | 154 | } |
gbrush | 0:e84a5ccbac19 | 155 | void WiiChuck::attach(pt2Func function) |
gbrush | 0:e84a5ccbac19 | 156 | { |
gbrush | 0:e84a5ccbac19 | 157 | _callback_input = function; |
gbrush | 0:e84a5ccbac19 | 158 | } |
gbrush | 0:e84a5ccbac19 | 159 | |
gbrush | 0:e84a5ccbac19 | 160 |