Wii Nunchuk module with nasty hacks from debugging on a FRDM-KL25Z

Fork of WiiChuk_compat by Greg Brush

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?

UserRevisionLine numberNew 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