Frank Weissenborn / WiiChuck

Dependents:   WiiNunchuckTest

Committer:
FrankWeissenborn
Date:
Wed Feb 02 19:44:59 2011 +0000
Revision:
3:13e1d0a345a6

        

Who changed what in which revision?

UserRevisionLine numberNew contents of line
FrankWeissenborn 3:13e1d0a345a6 1 #include "WiiChuck.h"
FrankWeissenborn 3:13e1d0a345a6 2
FrankWeissenborn 3:13e1d0a345a6 3
FrankWeissenborn 3:13e1d0a345a6 4
FrankWeissenborn 3:13e1d0a345a6 5 WiiChuck::WiiChuck(PinName data, PinName clk):_i2c(data, clk) {
FrankWeissenborn 3:13e1d0a345a6 6 Error = true;
FrankWeissenborn 3:13e1d0a345a6 7 unsigned char cmd[] = {NUNCHUCK_REGADDR, 0x00};
FrankWeissenborn 3:13e1d0a345a6 8 if (_i2c.write(NUNCHUCK_ADDR, (const char*)cmd, sizeof(cmd)) == I2C_ACK) {
FrankWeissenborn 3:13e1d0a345a6 9 Error = false;
FrankWeissenborn 3:13e1d0a345a6 10 }
FrankWeissenborn 3:13e1d0a345a6 11 _oldC = 0;
FrankWeissenborn 3:13e1d0a345a6 12 _oldZ = 0;
FrankWeissenborn 3:13e1d0a345a6 13 }
FrankWeissenborn 3:13e1d0a345a6 14
FrankWeissenborn 3:13e1d0a345a6 15 bool WiiChuck::Read(int* joyX,int* joyY,int* accX,int* accY,int* accZ,int* buttonC,int* buttonZ) {
FrankWeissenborn 3:13e1d0a345a6 16
FrankWeissenborn 3:13e1d0a345a6 17 int i;
FrankWeissenborn 3:13e1d0a345a6 18 char readBuf[NUNCHUCK_READLEN];
FrankWeissenborn 3:13e1d0a345a6 19
FrankWeissenborn 3:13e1d0a345a6 20 if (Error) {
FrankWeissenborn 3:13e1d0a345a6 21 return false;
FrankWeissenborn 3:13e1d0a345a6 22 }
FrankWeissenborn 3:13e1d0a345a6 23
FrankWeissenborn 3:13e1d0a345a6 24 const unsigned char cmd[] = {0x00};
FrankWeissenborn 3:13e1d0a345a6 25 if (_i2c.write(NUNCHUCK_ADDR, (const char*)cmd, sizeof(cmd)) == I2C_ACK) {
FrankWeissenborn 3:13e1d0a345a6 26 wait(I2C_READ_DELAY);
FrankWeissenborn 3:13e1d0a345a6 27 if (_i2c.read(NUNCHUCK_ADDR, readBuf, sizeof(readBuf)) == I2C_ACK) {
FrankWeissenborn 3:13e1d0a345a6 28 //init values
FrankWeissenborn 3:13e1d0a345a6 29 *joyX = 0; *joyY = 0; *accX = 0; *accY = 0; *accZ = 0; *buttonC = 0; *buttonZ = 0;
FrankWeissenborn 3:13e1d0a345a6 30
FrankWeissenborn 3:13e1d0a345a6 31 for (i = 0; i < NUNCHUCK_READLEN; ++i) {
FrankWeissenborn 3:13e1d0a345a6 32 readBuf[i] = (readBuf[i] ^ 0x17) + 0x17;
FrankWeissenborn 3:13e1d0a345a6 33 }
FrankWeissenborn 3:13e1d0a345a6 34 *joyX = readBuf[Joy_X];
FrankWeissenborn 3:13e1d0a345a6 35 *joyY = readBuf[Joy_Y];
FrankWeissenborn 3:13e1d0a345a6 36 *accX = readBuf[Acc_X] << 2;
FrankWeissenborn 3:13e1d0a345a6 37 *accY = readBuf[Acc_Y] << 2;
FrankWeissenborn 3:13e1d0a345a6 38 *accZ = readBuf[Acc_Z] << 2;
FrankWeissenborn 3:13e1d0a345a6 39
FrankWeissenborn 3:13e1d0a345a6 40 if (readBuf[Button] & 0x01) {
FrankWeissenborn 3:13e1d0a345a6 41 *buttonZ = 0;
FrankWeissenborn 3:13e1d0a345a6 42 } else {
FrankWeissenborn 3:13e1d0a345a6 43 *buttonZ = 1;
FrankWeissenborn 3:13e1d0a345a6 44 }
FrankWeissenborn 3:13e1d0a345a6 45 if (readBuf[Button] & 0x02) {
FrankWeissenborn 3:13e1d0a345a6 46 *buttonC = 0;
FrankWeissenborn 3:13e1d0a345a6 47 } else {
FrankWeissenborn 3:13e1d0a345a6 48 *buttonC = 1;
FrankWeissenborn 3:13e1d0a345a6 49 }
FrankWeissenborn 3:13e1d0a345a6 50 if (readBuf[Button] & 0x04) accX += 2;
FrankWeissenborn 3:13e1d0a345a6 51 if (readBuf[Button] & 0x08) accX += 1;
FrankWeissenborn 3:13e1d0a345a6 52 if (readBuf[Button] & 0x10) accY += 2;
FrankWeissenborn 3:13e1d0a345a6 53 if (readBuf[Button] & 0x20) accY += 1;
FrankWeissenborn 3:13e1d0a345a6 54 if (readBuf[Button] & 0x40) accZ += 2;
FrankWeissenborn 3:13e1d0a345a6 55 if (readBuf[Button] & 0x80) accZ += 1;
FrankWeissenborn 3:13e1d0a345a6 56 return true;
FrankWeissenborn 3:13e1d0a345a6 57 }
FrankWeissenborn 3:13e1d0a345a6 58 else
FrankWeissenborn 3:13e1d0a345a6 59 {
FrankWeissenborn 3:13e1d0a345a6 60 return false;
FrankWeissenborn 3:13e1d0a345a6 61 }
FrankWeissenborn 3:13e1d0a345a6 62 } else {
FrankWeissenborn 3:13e1d0a345a6 63 return false;
FrankWeissenborn 3:13e1d0a345a6 64 }
FrankWeissenborn 3:13e1d0a345a6 65 }
FrankWeissenborn 3:13e1d0a345a6 66
FrankWeissenborn 3:13e1d0a345a6 67 void WiiChuck::start()
FrankWeissenborn 3:13e1d0a345a6 68 {
FrankWeissenborn 3:13e1d0a345a6 69 _getValues.attach(this, &WiiChuck::getValues,0.2);
FrankWeissenborn 3:13e1d0a345a6 70 }
FrankWeissenborn 3:13e1d0a345a6 71 void WiiChuck::stop()
FrankWeissenborn 3:13e1d0a345a6 72 {
FrankWeissenborn 3:13e1d0a345a6 73 _getValues.detach();
FrankWeissenborn 3:13e1d0a345a6 74 }
FrankWeissenborn 3:13e1d0a345a6 75
FrankWeissenborn 3:13e1d0a345a6 76 void WiiChuck::getValues()
FrankWeissenborn 3:13e1d0a345a6 77 {
FrankWeissenborn 3:13e1d0a345a6 78 int joyX = 0;int joyY = 0;
FrankWeissenborn 3:13e1d0a345a6 79 int accX = 0;int accY = 0;int accZ = 0;
FrankWeissenborn 3:13e1d0a345a6 80 int buttonC = 0;int buttonZ = 0;
FrankWeissenborn 3:13e1d0a345a6 81
FrankWeissenborn 3:13e1d0a345a6 82 bool read = Read(&joyX,&joyY,&accX,&accY,&accZ,&buttonC,&buttonZ);
FrankWeissenborn 3:13e1d0a345a6 83
FrankWeissenborn 3:13e1d0a345a6 84 if(read)
FrankWeissenborn 3:13e1d0a345a6 85 {
FrankWeissenborn 3:13e1d0a345a6 86 //analyse
FrankWeissenborn 3:13e1d0a345a6 87 if(_oldC == 0 && buttonC == 1)
FrankWeissenborn 3:13e1d0a345a6 88 {
FrankWeissenborn 3:13e1d0a345a6 89 _oldC = 1;
FrankWeissenborn 3:13e1d0a345a6 90 _callback_input(BUTTON_CANCEL_VALUE);
FrankWeissenborn 3:13e1d0a345a6 91 return;
FrankWeissenborn 3:13e1d0a345a6 92 }
FrankWeissenborn 3:13e1d0a345a6 93 else
FrankWeissenborn 3:13e1d0a345a6 94 {
FrankWeissenborn 3:13e1d0a345a6 95 _oldC = buttonC;
FrankWeissenborn 3:13e1d0a345a6 96 }
FrankWeissenborn 3:13e1d0a345a6 97
FrankWeissenborn 3:13e1d0a345a6 98 //analyse
FrankWeissenborn 3:13e1d0a345a6 99 if(_oldZ == 0 && buttonZ == 1)
FrankWeissenborn 3:13e1d0a345a6 100 {
FrankWeissenborn 3:13e1d0a345a6 101 _oldZ = 1;
FrankWeissenborn 3:13e1d0a345a6 102 _callback_input(BUTTON_OK_VALUE);
FrankWeissenborn 3:13e1d0a345a6 103 return;
FrankWeissenborn 3:13e1d0a345a6 104 }
FrankWeissenborn 3:13e1d0a345a6 105 else
FrankWeissenborn 3:13e1d0a345a6 106 {
FrankWeissenborn 3:13e1d0a345a6 107 _oldZ = buttonZ;
FrankWeissenborn 3:13e1d0a345a6 108 }
FrankWeissenborn 3:13e1d0a345a6 109
FrankWeissenborn 3:13e1d0a345a6 110 if(joyY>160)
FrankWeissenborn 3:13e1d0a345a6 111 {
FrankWeissenborn 3:13e1d0a345a6 112 _callback_input(BUTTON_VOLUME_PLUS);
FrankWeissenborn 3:13e1d0a345a6 113 return;
FrankWeissenborn 3:13e1d0a345a6 114 }
FrankWeissenborn 3:13e1d0a345a6 115 if(joyY<80)
FrankWeissenborn 3:13e1d0a345a6 116 {
FrankWeissenborn 3:13e1d0a345a6 117
FrankWeissenborn 3:13e1d0a345a6 118 _callback_input(BUTTON_VOLUME_MINUS);
FrankWeissenborn 3:13e1d0a345a6 119 return;
FrankWeissenborn 3:13e1d0a345a6 120 }
FrankWeissenborn 3:13e1d0a345a6 121 if(joyX>160)
FrankWeissenborn 3:13e1d0a345a6 122 {
FrankWeissenborn 3:13e1d0a345a6 123 _callback_input(BUTTON_NEXT_VALUE);
FrankWeissenborn 3:13e1d0a345a6 124 return;
FrankWeissenborn 3:13e1d0a345a6 125 }
FrankWeissenborn 3:13e1d0a345a6 126 if(joyX<80)
FrankWeissenborn 3:13e1d0a345a6 127 {
FrankWeissenborn 3:13e1d0a345a6 128
FrankWeissenborn 3:13e1d0a345a6 129 _callback_input(BUTTON_PREV_VALUE);
FrankWeissenborn 3:13e1d0a345a6 130 return;
FrankWeissenborn 3:13e1d0a345a6 131 }
FrankWeissenborn 3:13e1d0a345a6 132
FrankWeissenborn 3:13e1d0a345a6 133 }
FrankWeissenborn 3:13e1d0a345a6 134 }
FrankWeissenborn 3:13e1d0a345a6 135 void WiiChuck::attach(pt2Func function)
FrankWeissenborn 3:13e1d0a345a6 136 {
FrankWeissenborn 3:13e1d0a345a6 137 _callback_input = function;
FrankWeissenborn 3:13e1d0a345a6 138 }
FrankWeissenborn 3:13e1d0a345a6 139
FrankWeissenborn 3:13e1d0a345a6 140