Revision of \"WiiChuck\" to use \"new\" initialization process that is compatible with 3rd party nunchuk controllers

Dependents:   wiiNunchuk_compat

Committer:
gbrush
Date:
Mon Mar 14 23:47:12 2011 +0000
Revision:
0:e84a5ccbac19
Initial

Who changed what in which revision?

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