Frank Weissenborn / WiiChuck

Dependents:   WiiNunchuckTest

Committer:
FrankWeissenborn
Date:
Wed Feb 02 12:02:54 2011 +0000
Revision:
1:f04b559e06b3
Parent:
0:f442b7eb68b0

        

Who changed what in which revision?

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